案例:计数器
1.设计定义–>分析,将问题转化控制电路
调用IP核设计一个模10的四位计数器。
计数器模块设计
2.综合
添加单个文件需手动Add
修改.v文件-->如何修改修改IP核?
四位计数器模块仿真
`timescale 1ns/1ns
`define clock_period 20//时钟周期20ns 也就是频率为50MHz
module counter_tb;
reg cin;//进位输入
reg clock;//计数基准时钟
wire cout;//进位输出
wire[3:0] q;
counter counter0(//调用模块
.cin(cin),
.clock(clock),
.cout(cout),
.q(q)
);
initial
begin
repeat(20)//重复20次,cin低电平保持5个时钟周期,高电平保持1个时钟周期
begin
cin=0;
#(`clock_period*5) cin=1;
#(`clock_period) cin=0;
end
#(`clock_period*200) $stop;
end
initial clock=1;
always #(`clock_period/2)
clock=~clock;
endmodule
3.布局布线
4.时序仿真与功能仿真
右击tb文件,右击recomplie,没有错误和警告,点击restart
5.编程下载和在线测试
四位计数器级联成八位计数器
调用IP核设计一个四位计数器,并在此基础之上级联成八位计数器。
1.设计定义–>分析,将问题转化控制电路
四位计数器级联成八位计数器模块设计
2.综合
四位计数器级联成八位计数器模块.v
module counter_top(cin,clock,cout,q);
/*
四位计数器级联成八位计数器,计数记到1111_1111(255),进位输出1
*/
input cin;//计数使能信号
input clock;//计数基准时钟
output cout;//进位输出信号
output[7:0] q;
wire cout0;//counter0的进位输出作为counter1的进位使能信号
counter counter0(
.cin(cin),
.clock(clock),
.cout(cout0),
.q(q[3:0])//低四位计数
);
counter counter1(
.cin(cout0),
.clock(clock),
.cout(cout),
.q(q[7:4])//高四位计数
);
endmodule
四位计数器级联成八位计数器模块仿真
`timescale 1ns/1ns
`define clock_period 20//时钟周期20ns 频率为50MHz
module counter_top_tb;
reg cin;//进位输入
reg clock;//计数基准时钟
wire cout;//进位输出
wire[7:0] q;
counter_top counter_top0(
.cin(cin),
.clock(clock),
.cout(cout),
.q(q)
);
initial
begin
repeat(300)//重复300次,cin低电平保持5个时钟周期,高电平保持1个时钟周期
begin
cin=0;
#(`clock_period*5) cin=1;//cin=1时,计数使能,时钟到,计数++
#(`clock_period) cin=0;
end
#(`clock_period*200) $stop;
end
initial clock=1;
always #(`clock_period/2)
clock=~clock;
endmodule