FPGA 12 调用IP核实现8421BCD码计数器
目的: 使用 IP 核实现和自己编写的8421BCD码一样的功能,便于自己在后续开发的时候,可以考虑使用IP核来实现自己的功能。而不是都自己来编写逻辑函数文件。
1、选中IP核选项
2、创建一个IP核模块,共有3个选项
3、选择所需要的IP核模块
选中所选的IP核模块,本次选用的是一个 conter模块进行演示
配置IP核选项
通用配置 1
通用配置 2
通用配置3
仿真库(默认即可 —》 直接 next )
总结设置(默认即可)
点击Yes ,暂时不勾选自动添加ip核
添加成功效果如下所示:
添加 IP核生成的模块到项目中:
1、
2、
3、添加文件
此时可以看到通过IP配置添加的conter.v 模块
测试与验证
1、设置模块为顶层文件
2、开始编译(Ctrl+ L),看是否有错误
3、此时可以看一下rtl 视图(芯片内部的结构)
4、双击芯片可以看到内部的电路结构
调用IP核的优势
1、生成模块非常快速
2、内部做过优化代码
3、提高设计效率
编写测试文件
测试文件如下所示:
`timescale 1ns/1ns
`define clock_period 20
module conter_tb ;
reg cin ; //进位输入( +1)
reg clk; //计数基准时钟
wire cout ; //进位输出(达到进位输出的时候则发送进位信号)
wire [3:0]q ; //4位计数器输出
conter conter0 (
.cin(cin),
.clock(clk),
.cout(cout),
.q(q)
);
initial clk =1 ;
always #(`clock_period/2) clk =~clk ;
initial begin
repeat (25) begin // repeat : 这里表示重复5次
cin = 0; //先初始化 cin =0 ; 低电平
#(`clock_period * 5) ;
cin = 1 ; //隔5个时钟周期后,cin =1 变为高电平
#(`clock_period) ;
end
cin = 0 ; //隔1个时钟周期后,cin =0 变为低电平
#(`clock_period * 200) ;
$stop ;
end
endmodule
仿真测试效果
修改IP核参数
开始修改参数
更新后,需要再次重新编译文件
再次仿真看测试结果
编写一个二进制的代码
``timescale 1ns/1ns
`define clock_period 20
module conter_top_tb ;
reg cin ; //进位输入( +1)
reg clk; //计数基准时钟
wire cout ; //进位输出
wire [7:0]q ; //计数器输出
conter_top conter_top_0(
.cin(cin) ,
.clk(clk) ,
.cout(cout) ,
.q(q)
);
initial clk =1 ;
always #(`clock_period/2) clk =~clk ;
initial begin
repeat (320) begin // repeat : 这里表示重复320次
cin = 0; //先初始化 cin =0 ; 低电平
#(`clock_period * 5) cin = 1 ; //隔5个时钟周期后,cin =1 变为高电平
#(`clock_period) cin = 0 ; //隔1个时钟周期后,cin =0 变为低电平
end
#(`clock_period * 200) ;
$stop ;
end
endmodule
可以得到一个16进制的9(前四位最大到9)9(后四位最大到9)的数