赞
踩
FPGA初学-调用IP核实现计数器
首先新建工程文件,我将它命名为counter_ip
点击tools-MegaWizard
选择Up only,增计数模式。点击next
设置计数器计数到10的时候自动清零(因为计数器是四位的,最大值是15)
选择carry-in和carry-out,具体为啥老师说等到后面讲计数器级联的时候再解释,我也不懂。然后一路next,然后funish。
然后就可以看到qip文件已经添加进来了。
右键files-add/removefiles
添加counter
新建一个Verilog文件
命名为counter_tb
编写test bench文件
`timescale 1ns/1ns `define clock_period 20 module counter_tb; reg cin;//进位输入 reg clk;//计数基准时钟 wire cout;//进位输出,当计数达到顶值时,产生cout脉冲信号输出 wire [3:0]q;//计数器 counter counter0( .cin(cin), .clock(clk), .cout(cout), .q(q) ); initial clk = 1; always #(`clock_period/2) clk=~clk; initial begin repeat(20)begin cin=0; #(`clock_period*5)cin=1;//延时5个时钟周期之后,让cin信号等于1 #(`clock_period)cin=0;//再延时一个时钟信号之后让cin信号等于0,此时就产生了一个脉冲信号 //以上,让高电平保持五个时钟周期,让低电平保持一个时钟周期 end #(`clock_period*200); $stop; end endmodule
保存,编译,点击tools-run simulation tools-rtl simulation
将q显示成十进制可以看到,计数到9之后就置零了,因为我们一开始在设置ip核的时候设置的是计数10个数清零
下面试一下八位计数
八位计数,我们采用两个计数器级联的模式进行计数。当第一级计满16次之后,cout连接第二级的cin
奈何电脑显示不行
奈何ipad版本低用不了pencil
新建counter_top.v
module counter_top(cin,clk,cout,q); input cin; input clk; output cout; output [7:0]q; wire count0; counter counter0( .cin(cin), .clock(clk), .cout(count0),//第一级的cout连接到第二级的cin .q(q[3:0]) ); counter counter1( .cin(count0), .clock(clk), .cout(cout), .q(q[7:4]) ); endmodule
新建counter_top_tb.v
`timescale 1ns/1ns `define clock_period 20 module counter_top_tb; reg cin;//进位输入 reg clk;//计数基准时钟 wire cout;//进位输出,当计数达到顶值时,产生cout脉冲信号输出 wire [7:0]q;//计数器 counter_top counter0( .cin(cin), .clk(clk), .cout(cout), .q(q) ); initial clk = 1; always #(`clock_period/2) clk=~clk; initial begin repeat(300)begin cin=0; #(`clock_period*5)cin=1;//延时5个时钟周期之后,让cin信号等于1 #(`clock_period)cin=0;//再延时一个时钟信号之后让cin信号等于0,此时就产生了一个脉冲信号 //以上,让高电平保持五个时钟周期,让低电平保持一个时钟周期 end #(`clock_period*200); $stop; end endmodule
最后的结果是
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。