FPGA入门笔记004——BCD计数器设计与使用
1.FPGA入门笔记0012.# FPGA入门笔记002——译码器3.FPGA入门笔记006——状态机设计实例4.FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别
5.FPGA入门笔记004——BCD计数器设计与使用
6.FPGA入门笔记003——计数器IP核调用与验证7.FPGA入门笔记013——嵌入式块RAM使用之FIFO8.FPGA入门笔记012——嵌入式块RAM应用之ROM9.FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统10.FPGA入门笔记011_A——嵌入式块RAM的使用11.FPGA入门笔记010——UART串口接收模块设计12.FPGA入门笔记009——UART串口发送模块设计13.FPGA入门笔记008——数码管动态扫描设计与验证14.FPGA入门笔记007_A——按键消抖模块设计与验证(状态机、$random、仿真模型、task语法)1、设置一个最大值为10的四位计数器,Verilog代码如下:
module BCD_Counter( Clk, Cin, Rst_n, Cout, q ); input Clk; //计数器基准时钟 input Cin; //计数器进位输入 input Rst_n; //系统复位 // output Reg Cout; //计数器进位输出 output Cout; //计数器进位输出 output [3:0]q; //计数值输出 reg [3:0]cnt; //定义计数器寄存器 //执行计数过程 always@(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; //若为以下代码,则会产生时延错误 // always@(posedge Clk or negedge Rst_n) // if(Rst_n == 1'b0) // Cout <= 1'b0; // else if(cnt == 4'd9 && Cin == 1'b1) // Cout <= 1'b1; // else // Cout <= 1'b0; assign Cout = (cnt == 4'd9 && Cin == 1'b1); //产生进位输出信号 assign q = cnt; endmodule
2、设置仿真测试文件,代码如下:
`timescale 1ns/1ns `define clock_period 20 module BCD_Counter_tb; reg Clk; reg Cin; reg Rst_n; wire Cout; wire [3:0]q; BCD_Counter BCD_Counter0( .Clk(Clk), .Cin(Cin), .Rst_n(Rst_n), .Cout(Cout), .q(q) ); initial Clk = 1; always#(`clock_period / 2) Clk = ~Clk; initial begin Rst_n = 1'b0; Cin = 1'b0; #(`clock_period * 200); Rst_n = 1'b1; #(`clock_period * 20); repeat(30)begin //重复执行30次 Cin = 1'b1; #`clock_period; Cin = 1'b0; #(`clock_period * 5); end #(`clock_period * 20); $stop; end endmodule
3、将三个四位计数器相连,生成一个12位的BCD计数器,代码如下:
module BCD_Counter_top( Clk, Cin, Rst_n, Cout, q ); input Clk; //计数器基准时钟 input Cin; //计数器进位输入 input Rst_n; //系统复位 output Cout; //计数器进位输出 output [11:0]q; //计数值输出 wire Cout0,Cout1; wire [3:0]q0,q1,q2; assign q = {q2,q1,q0}; BCD_Counter BCD_Counter0( .Clk(Clk), .Cin(Cin), .Rst_n(Rst_n), .Cout(Cout0), .q(q0) ); BCD_Counter BCD_Counter1( .Clk(Clk), .Cin(Cout0), .Rst_n(Rst_n), .Cout(Cout1), .q(q1) ); BCD_Counter BCD_Counter2( .Clk(Clk), .Cin(Cout1), .Rst_n(Rst_n), .Cout(Cout), .q(q2) ); endmodule
4、设置仿真测试文件,代码如下:
`timescale 1ns/1ns `define clock_period 20 module BCD_Counter_top_tb; reg Clk; reg Cin; reg Rst_n; wire Cout; wire [11:0]q; BCD_Counter_top BCD_Counter_top0( .Clk(Clk), .Cin(Cin), .Rst_n(Rst_n), .Cout(Cout), .q(q) ); initial Clk = 1; always#(`clock_period / 2) Clk = ~Clk; initial begin Rst_n = 1'b0; Cin = 1'b0; #(`clock_period * 200); Rst_n = 1'b1; #(`clock_period * 20); Cin = 1'b1; #(`clock_period * 5000); $stop; end endmodule
本文作者:Yamada_Ryo
本文链接:https://www.cnblogs.com/little55/p/17846493.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
合集:
FPGA入门笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步