找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5942|回复: 1
打印 上一主题 下一主题
收起左侧

FPGA学习-高性能计数器IP核调用与验证

[复制链接]
跳转到指定楼层
楼主
ID:108531 发表于 2016-3-12 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1、利用Quartus II自带的计数器IP核来熟悉怎么使用Quartus II的IP核。

2、使用计数器IP核的步骤(具体过程参考视频,这里贴出几张比较重要的步骤以及解释)

 

 

 

这一步不能勾选,否则会出现其他问题(暂时还不明白是咋回事)

 

 

3、生成的原理图(看不懂、略)

4、仿真程序

/* 实验名称:计数器IP核验证

 * 程序功能:每5个时钟周期计数一次,当计数10次后输出一个高电平

 */

 

`timescale 1ns/1ns

`define clock_period    20

 

module count_ip_tb;

 

    reg cin;           

    reg clk;

    wire cout;

    wire[3:0] q;

   

    count_ip count_ip0(

    .cin(cin),        // cin 给一次高电平,计数一次并通过 q 输出

    .clock(clk),    // 时钟频率

    .cout(cout),    // 当计数器溢出或者计数到指定的数值会输出一个时钟周期的高电平

    .q(q)                // cin 为高电平是,更新计数器的值并通过 q 输出

    );

   

    initial clk = 1;

    always #(`clock_period/2) clk = ~clk;    // 产生时钟

   

    initial begin

        repeat(20)begin                // 循环 20 次

            // 为了方便理解,这部分是我改写的代码

            cin = 0;                       

            #(`clock_period * 5);    //cin 维持5个时钟的低电平   

            cin = 1;

            #(`clock_period);            //cin 维持1个时钟的高电平

                   

        end

       

        cin = 0;        // 为避免计数器继续计数输出,需要将 cin 设置为低电平

       

        #(`clock_period * 200);            // 延时200个时钟周期

        $stop;                                // 停止执行

   

    end

 

endmodule 

 

5、输出的波形



6、两个4位计数器IP核级联为8位计数器


 

7、源程序(注意,这里需要将计数器IP核设置为 Plain binary 即计数到最大值

/* 实验名称:级联计数器IP核

 * 程序功能:将两个4位计数器IP核级联实现8位计数器

 */

module mytest(cin, clk, cout, q);

    input cin;       

    input clk;

    output cout;

    output[7:0] q;

   

    wire cout0;        // 线网类型,暂时理解为导线

    // 计数器0

    count_ip count_ip0(

    .cin(cin),        // cin 触发计数

    .clock(clk),        // 时钟

    // 计数器0的 count 通过 cout0 与计数器1的 cin 链接

    .cout(cout0),        // 当计数器溢出了,cout就会触发一个时钟的高电平

    .q(q[3:0])        // 输出计数器的值为低4位,即表示计数了多少次

    );

    // 计数器1

    count_ip count_ip1(

    // cin 的触发由计数器0的cout输出触发

    .cin(cout0),        // 当计数器0溢出1次这里才计数1次

    .clock(clk),        // 时钟

    .cout(cout),        // 当计数器1溢出了,就会输出一个时钟的高电平

    .q(q[7:4])        // 输出计数器的值为高4位,即表示多少个计数器0溢出

    );

endmodule   

 

 

8、仿真源程序

/* 实验名称:级联计数器IP核验证

 * 程序功能:测试级联过后的计数器是否为8位

 */

`timescale 1ns/1ns

`define clock_period    20

 

module mytest_tb;

    reg cin;           

    reg clk;

    wire cout;

    wire[7:0] q;

   

    mytest count_ip(

    .cin(cin),        // cin 给一次高电平,计数一次并通过 q 输出

    .clk(clk),        // 时钟频率

    .cout(cout),        // 当计数器溢出或者计数到指定的数值会输出一个时钟周期的高电平

    .q(q)            // cin 为高电平是,更新计数器的值并通过 q 输出

    );

   

    initial clk = 1;

    always #(`clock_period/2)  clk = ~clk;    // 产生时钟

   

    initial begin

        repeat(300)begin                    // 循环 20 次

            // 为了方便理解,这部分是我改写的代码

            cin = 0;                       

            #(`clock_period * 5);            //cin 维持5个时钟的低电平   

            cin = 1;

            #(`clock_period);                //cin 维持1个时钟的高电平

                   

        end

       

        cin = 0;        // 为避免计数器继续计数输出,需要将 cin 设置为低电平

       

        #(`clock_period * 200);                // 延时200个时钟周期

        $stop;                            // 停止执行

   

    end

 

endmodule   

 

 

9、波形图(图中 q 显示的值是无符号十进制)

 

10、电路图

 

11、级联8位的好处是可以将两个计数器的值进行分离。举个例子,我们要将两位计数的数字显示在两个数码管中,那么就可以将计数器0的输出端q直接输出给表示个位的数码管,而计数器1的输出端q直接输出给表示十位的数码管即可。

 

12、波形图(设置计数器计数到9,十六进制)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:108615 发表于 2016-3-14 00:29 | 只看该作者
教程很好,收藏保存了,51黑论坛有你更精彩!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表