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
最后的结果是