verilog编程,可能你一直在错误地使用计数器cnt

计数器是verilog编程中非常常用的一种技巧,但是我们如果是C等语言的编程思维则极有可能错误地使用计数器。下面举个例子:

module delay (
	input clk_sys,  //系统时钟
	input rst_n,
	output reg [31:0] time_cnt         
);
parameter DELAY_TIME = 32'd50; //计数总时钟个数
reg [31:0] time_cnt_r;

//组合电路,实现计数器自增1
always @(*) begin
	if(time_cnt == DELAY_TIME) 
		time_cnt_r = 32'h1;
	else 
		time_cnt_r = time_cnt_r + 1;

end
//时序电路,实现同步输出到端口
always @(posedge clk_sys or negedge rst_n) begin
	if(!rst_n) 
		time_cnt <= 32'h0;
	else 
		time_cnt <= time_cnt_r;
end

endmodule
该模块实现对系统时钟的计数,计数到50个时钟个数则清零重新开始计数。代码中
time_cnt_r = time_cnt_r + 1;

这条语句大家并不陌生,在C语言里,典型的计数方式。

我们使用quartus编译综合得出的电路:


是不是感觉有点复杂。我们把代码稍微变一下,把上面那条计数器自增1代码改成:

time_cnt_r = time_cnt + 1;
再次编译综合,得到的RTL电路如下:


电路竟然变得如此简洁,更重要的是节省了很多很多的buf资源:


仔细对比两条计数器自增1代码,发现区别在于:前面一个是计数器+1后赋值给自己,而后面一个是计数器+1后赋值给另外一个临时计数器。

一个小小的改动,结果相差这么大,值得深思。

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cnt10是一种使用Verilog编程语言实现的计数器Verilog是一种硬件描述语言,广泛应用于数字电路设计和验证。cnt10是一个计数器,它可以自动进行数值递增,并在达到特定条件时重新开始计数。 cnt10的实现可以借助Verilog中的寄存器和组合逻辑来实现。首先,我们需要定义一个数字表示计数器的寄存器,并将其初始化为0。然后,我们使用组合逻辑来判断是否应该递增计数器的值。当满足特定的条件时,比如达到某个特定的数值,我们可以将计数器的值重置为0。 以下是一个简单的示例代码: ```verilog module cnt10 ( input wire clk, input wire reset, output wire [3:0] count ); reg [3:0] count_reg; always @(posedge clk or posedge reset) begin if (reset) begin count_reg <= 4'b0000; //将计数器重置为0 end else if (count_reg == 4'b1001) begin count_reg <= 4'b0000; //达到9时,重新计数 end else begin count_reg <= count_reg + 1; //递增计数器的值 end end assign count = count_reg; endmodule ``` 上述代码中,cnt10模块具有一个输入时钟信号`clk`和复位信号`reset`,以及一个4位的输出信号`count`用于显示计数器的值。在时钟的上升沿或复位信号被触发时,always块将会执行。当复位信号处于高电平时,计数器被重置为0;当计数器的值等于9时,计数器的值被重置为0;否则,计数器的值将会自增1。 通过使用这个cnt10模块,我们可以在Verilog中实现一个可自动计数并重新开始计数的计数器。这是Verilog的一种基础应用,可以在数字电路设计中发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值