调用IP核实现计数器
-
打开Quartus II
-
创建新工程,步骤同https://blog.csdn.net/qq_43110479/article/details/115472241
-
引入ip核
如图,选择MegaWizrd plug-in manager
此处选择新建,然后在Arithmetic中找到LPM_COUNTER,选择后保存在项目的ip文件夹内(这里为了方便归类,顺便创建的ip文件夹,也可以放在其他地方,看个人喜好)。
引入之后便进行ip核的配置。output bus代表输出总线宽度,根据自己所需位数而定。例如,若是需要计数1000,则可以设置总线宽度为10位(即1023最大计数值),此处选择了4位。counter direction代表计数方向,这里提供了三个选项:up、down和updown,按需求选择。这里选择的是up,即向上计数。
单机next,出现如下Optional Inputs对话框。
可以选择默认的二进制计数,以及自定义Modulus(计数单位:若设为10,即使选用的是4位计数器,每当计满10位就进行清零)。附加引脚有以下选项:1、clock enable:时钟使能;2、carry-in:进位输入;3、carry-out:进位输出;4、count enable:计数使能。
其中进位附加引脚可用于级联,或给出溢出信号。全勾上,缺啥用啥。、……继续点击next,出现一堆关于同步异步的端口选项,不勾了,继续next直到finish。
这里简单介绍:当创建ip变量时,ip文件会自动生成。ip文件是用来表示设计中的ip核。这里选择把ip文件加入到项目中即可。在导航栏中点击Files。右键单机Files,添加文件。
将以上两个verilog文件添加到项目。打开my_ip.v可以看到,里边有一个根据之前配置的counter,如下图。
-
tb文件编写
在编写tb文件之前,先将该文件设置为顶层。编写tb文件如下:
`timescale 1ns/1ps
module counter_tb;
reg m_cin;
reg m_clk_en;
reg m_clk;
reg m_cnt_en;
wire m_cout;
wire [3:0] m_q;
my_ip counter0(
.cin(m_cin),
.clk_en(m_clk_en),
.clock(m_clk),
.cnt_en(m_cnt_en),
.cout(m_cout),
.q(m_q)
);
initial m_clk_en=1;
initial m_cnt_en=1;
initial m_cin=1;
initial m_clk=1;
always #10 m_clk=~m_clk;
initial begin
repeat(50) begin
m_cin=1;
#10;
m_cin=0;
#40;
end
$stop;
end
endmodule
- 编译与仿真
编译。发现报错:my_ip不能够被定义两次,将前面添加的两个文件中的my_ip_bb.v删除,再次编译:通过。
将tb路径添加到仿真路径中,仿真波形如下。(15的时候有两次连续的c_out输出,且和cin同步,不知道问题在哪?)