常见计数器的verilog实现
时间:2025-10-23 22:28:51
手机看文章
扫描二维码
随时随地手机看文章
第一种:
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+1end//--------------------------------------------------------------- // 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置为1endendmodule
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,也就是频率为50MHzmodule 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仿真
第二种:
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 [2:0] cnt ; //定义变量cnt的数据类型和数据位宽//--------------------------------------------------------------- // 计数模块//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 cnt <= 2'b0; //复位时,变量cnt置为0 else if(cnt==4) //当变量cnt为4时 cnt <= 3'b1; //变量cnt置为1 else //其它情况 cnt <= cnt + 3'b1; //变量cnt+1end//--------------------------------------------------------------- // led模块//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 led <= 1'b0; //复位时,变量led置为0 else if(cnt==3'd4) //当变量cnt为4时 led <= 1'b1; //变量led置为1 else //其它情况 led <= 1'b0; //变量led置为1endendmodule
testbench同第一种方法一样。
对应的modesim仿真
第三种:
//**************************************************************************// *** 名称 : 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 led ; //输出ied信号wire add_cnt ; //定义变量add_cnt的数据类型和数据位宽 wire end_cnt ; //定义变量end_cnt的数据类型和数据位宽reg [1:0]cnt ; //定义变量cnt的数据类型和数据位宽//--------------------------------------------------------------- // 计数模块//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 cnt <= 2'b0; //复位时,变量cnt置为0 else if(add_cnt) begin //当add_cnt信号拉高时 if(end_cnt) //当add_cnt信号拉高,end_cnt也拉高时 cnt <= 2'b0; //变量cnt置为0 else //当add_cnt信号拉高,end_cnt拉低时 cnt <= cnt + 2'b1; //变量cnt+1 endendassign add_cnt = 1; //表示add_cnt信号一直处于拉高状态assign end_cnt = add_cnt && cnt == 4-1; //表示当add_cnt信号拉高,且cnt为4-1时,end_cnt拉高assign led = end_cnt; //表示将end_cnt信号直接连到led信号上,进行输出endmodule
testbench同第一种方法一样。
对应的modesim仿真
第四种:
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 led ; //输出ied信号wire add_cnt ; //定义变量add_cnt的数据类型和数据位宽 wire end_cnt ; //定义变量end_cnt的数据类型和数据位宽reg [2:0]cnt ; //定义变量cnt的数据类型和数据位宽//--------------------------------------------------------------- // 计数模块//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //复位信号拉低 cnt <= 3'b0; //复位时,变量cnt置为0 else if(add_cnt) begin //当add_cnt信号拉高时 if(end_cnt) //当add_cnt信号拉高,end_cnt也拉高时 cnt <= 3'b1; //变量cnt置为1 else //当add_cnt信号拉高,end_cnt拉低时 cnt <= cnt + 3'b1; //变量cnt+1 endendassign add_cnt = 1; //表示add_cnt信号一直处于拉高状态assign end_cnt = add_cnt && cnt == 4; //表示当add_cnt信号拉高,且cnt为4时,end_cnt拉高assign led = end_cnt; //表示将end_cnt信号直接连到led信号上,进行输出endmodule
testbench同第一种方法一样。
对应的modesim仿真
计数器就讲这些了,最近高清壁纸快要用完了,如果网友们有相关资源,欢迎分享!





