ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计数器(Verilog)

2021-07-26 15:01:27  阅读:218  来源: 互联网

标签:begin dout clk 计数器 Verilog rstn 时钟


简介

计数器的用处很多,比如在设计分频器时,需要用到计数器对每个时钟边沿进行计数,当记到某个数时,时钟翻转。同样在设计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

在这里插入图片描述

标签:begin,dout,clk,计数器,Verilog,rstn,时钟
来源: https://blog.csdn.net/SummerXRT/article/details/119107916

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有