FPGA7 3BCD计数器级联
程序员文章站
2022-06-08 22:57:01
...
电路
三个BCD计数器,进行级联
第一个计数器计满十次,第二个计数器计一次。
第二个计数器计一次,第三个计数器计一次。
10的三次方=1000 也就是说,即使是当cin一直为有效电平的时候,时钟上沿也要到来1000次
最后面的Cout 才会输出1
这期间 q[11,0] 的值会一直变化 由0~999 都是bcd码
底层计数器
module BCD_counter (Clk,Cin,Rst_n,Cout,q);
input Clk;
input Cin; //进位输入 与普通计数器一样 这个为高电平时
//计数器的值才会+1
input Rst_n;
output Cout;
output [3:0]q; //计数值输出
reg [3:0]cnt; //凡是在always中赋值的都应该是reg类型
//定义一个计数器
//计数过程
aaa@qq.com(posedge Clk or negedge Rst_n)
if (Rst_n == 1'b0)
cnt <= 4'd0;
else if (Cin == 1'b1) begin
if (cnt == 4'd9)
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
end
else
cnt <= cnt ; //可写可不写
//产生进位输出信号
assign Cout = (Cin == 1'b1 && cnt == 4'd9) ;
//当计数器计数值为9 并且 cin为1时, Cout=1
assign q = cnt; //把cnt的值传给q 实时输出到外部
endmodule
计数器拼接 (记得设置为顶层模块)
module BCD_counter_top(Clk,Cin,Rst_n,Cout,q);
input Clk;
input Cin;
input Rst_n;
output Cout;
output [11:0]q; //3个计数器级联
wire cout0;
wire cout1;
wire [3:0]q0;
wire [3:0]q1;
wire [3:0]q2;
assign q = {q2,q1,q0}; //花括号进行位拼接
BCD_counter C0(
.Clk(Clk),//共用
.Cin(Cin),
.Rst_n(Rst_n),
.Cout(cout0),//共用
.q(q0)
);
BCD_counter C1(
.Clk(Clk),//共用
.Cin(cout0),
.Rst_n(Rst_n),//共用
.Cout(cout1),
.q(q1)
);
BCD_counter C2(
.Clk(Clk),//共用
.Cin(cout1),
.Rst_n(Rst_n),//共用
.Cout(Cout),
.q(q2)
);
endmodule
testbench
`timescale 1ns/1ns
module BCD_counter_top_tb;
reg clk1;
reg cin1;
reg rst_n1;
wire cout1;
wire [11:0]q1;
BCD_counter_top u0(
.Clk(clk1),
.Cin(cin1),
.Rst_n(rst_n1),
.Cout(cout1),
.q(q1)
);
initial clk1 = 1'b1;
always#(20/2)
clk1 = ~ clk1;
initial begin
rst_n1 = 1'b0;
cin1 = 1'b0;
#(20*200);
rst_n1 = 1'b1;
#(20*20);
cin1 = 1'b1;
#(20*2000);//延时2000的时钟周期 大于999 保证能看到
$stop;
end
endmodule
前仿真
q的值从 0到999 共改变1000次,计数共完成1000次 。
后仿真
上一篇: 正则实现最小匹配的开发经验
下一篇: X281x的时钟和系统控制初始化代码分析
推荐阅读