这篇博客来介绍一些常见的计数器。话不多少,直接上代码。
第一种:
rtl可综合电路
//************************************************************************** // *** 名称 : count.v // *** 作者 : 南明离火hk // *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/ // *** 日期 : 2021-07-08 // *** 描述 : 计数器模块 //************************************************************************** module count (clk,rst_n,led) ; input clk ; //输入50M的时钟 input rst_n ; //输入复位信号 output reg led ; //输出ied信号 reg [1:0] cnt ; //定义变量cnt的数据类型和数据位 //--------------------------------------------------------------- // 计数模块 //--------------------------------------------------------------- always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 cnt <= 2‘b0; //复位时,变量cnt置为0 else if(cnt==3) //当变量cnt为3时 cnt <= 2‘b0; //变量cnt置为0 else //其它情况 cnt <= cnt + 2‘b1; //变量cnt+1 end //--------------------------------------------------------------- // led模块 //--------------------------------------------------------------- always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 led <= 1‘b0; //复位时,变量led置为0 else if(cnt==2‘d3) //当变量cnt为3时 led <= 1‘b1; //变量led置为1 else //其它情况 led <= 1‘b0; //变量led置为1 end endmodule
testbench
//************************************************************************** // *** 名称 : count_tb.v // *** 作者 : 南明离火hk // *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/ // *** 日期 : 2021-07-08 // *** 描述 : 计数器仿真模块 //************************************************************************** `timescale 1ns/1ps //·timescale 定义仿真时间单位与精度,1ns是时间单位,即在仿真中用#10表示延迟10ns //1ps表示时间精度,比如你写 #3.5547968525 a <= 1;c <= 1;,那么它时间精度也只会有1ps(即在3.555ns时赋值语句便生效)。 `define clock_period 20 //时钟周期为20ns,也就是频率为50MHz module count_tb; //在testbench中,输入都是要自己定义的,所以输入信号都是reg,而输出则是wire信号 reg clk; //定义reg型的clk reg rst_n; //定义reg型的rst_n wire led; //定义wire型的rst_n count u_count( //把写好的计数器模块例化进来 .clk(clk), .rst_n(rst_n), .led(led) ); initial clk = 1; //定义clk信号的初始值为1 always #(`clock_period/2) clk = ~clk; //每隔半个时钟周期,clk的值变化一次 initial begin rst_n = 1‘b0; //一开始,令复位信号rst_n拉低,表示复位状态有效 #(`clock_period *10); //经过10个时钟周期之后 rst_n = 1‘b1; //令复位信号rst_n拉高,表示复位状态无效 #(`clock_period *10); //经过10个时钟周期之后 $stop; //停止 end endmodule
对应的modesim仿真