博主福利:100G+电子设计学习资源包!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect
--------------------------------------------------------------------------------------------------------------------------
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,十六进制)