计数器(Verilog)

👉注:更多精彩请看:面试常问的verilog代码汇总 一文

简介

计数器的用处很多,比如在设计分频器时,需要用到计数器对每个时钟边沿进行计数,当记到某个数时,时钟翻转。同样在设计FIFO时,读写指针也需要没读或写一次,就需要讲计数器加1。下面我介绍一些简单的8位计数器的Verilog设计,仿真结果在文末。

8位计数器

计数器的设计如下:在每个时钟商上升沿到来时,计数器就加1。
在这里插入图片描述

module counter(clk,rstn,dout);
	input clk,rstn;
	output [7:0]dout;
	
	reg    [7:0]dout;
	
	wire   [7:0]sum;
	assign      sum = dout + 1;//组合逻辑部分
	
	always@(posedge clk or negedge rstn) begin
		if(!rstn)begin
			dout <= 0;
		end	
		else begin
			dout <= sum;
		end	
	end	
endmodule

`timescale 1ns/1ps
module TB;
	
	reg   	clk,rstn;
	wire  	[7:0]dout;
	
	counter dut (.clk(clk),
				 .rstn(rstn),
				 .dout(dout)
		);
	
	initial begin 
	    clk <= 0;
	    forever begin
	      #5 clk <= !clk;
	    end
    #500 $finish;
	end
	
	initial begin 
	    #10 rstn <= 0;
	    repeat(10) @(posedge clk);
	    rstn <= 1;
  	end
		
endmodule

另外一种简单的写法就是:
等到它计数计到溢出(8’hff)时,还是会自动的返回到0开始重新计数。只不过当你不是讲计数器计满时,就需要设置注释部分,讲计数器的值归0。


module counter(clk,rstn,dout);
	input clk,rstn;
	output [7:0]dout;
	
	reg    [7:0]dout;
	
	always@(posedge clk or negedge rstn) begin
		if(!rstn) begin
			dout <= 0;
		end
		/*
		else if(dout == 8'hff) begin
			dout <= 0;
		end	
		*/
		else begin
			dout <= dout + 1;
		end
	end	
endmodule

在这里插入图片描述

  • 16
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值