verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

这篇具有很好参考价值的文章主要介绍了verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

2023.5.12


一、二进制计数器(n位 2^n状态)

1.1 可置位计数器

编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号zero,当置位信号set 有效时,将当前输出置为输入的数值set_num
verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)
注意:这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一拍输出,就能和zero=1变化同步了。

module count_module(
	input clk,
	input rst_n,
	input set,
	input [3:0] set_num,
	output reg [3:0]number,
	output reg zero
	);
	reg [3:0] cnt;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			cnt<=0;
		else if(set)
			cnt<=set_num;
		else
			cnt<=(cnt==15)?0:cnt+1;
	end

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			zero<=0;
		else 
			zero<=(cnt==0)?1:0;
	end

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			number<=0;
		else 
			number<=cnt;
	end
endmodule

1.2 加减计数器

一个十进制计数器模块,当mode信号为1,计数器输出信号递增,当mode信号为0,计数器输出信号递减。每次到达0,给出指示信号zero。

module count_module(
	input clk,
	input rst_n,
	input mode,
	output reg [3:0]number,
	output reg zero
	);
    
    reg[3:0] number1;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            number1<=0;
        end
        else if(mode)
        	number1<=(number==9) ? 0 : number1+1;
        else if(~mode)       
            number1<=(number==0) ? 9 : number1-1;
        else
            number1<=number1;
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            number<=0;
        else
            number<=number1;
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            zero<=0;
        else if(number1==0)
            zero<=1;
        else
            zero<=0;
    end    
endmodule

二、环形计数器(n位 n状态)

0001-0010-0100-1000-0001
独热码,相邻两位之间会有两位不相同

优点:

  • 状态译码简单,设计简单,修改灵活

缺点:

  • 有许多无限状态
reg [3:0] count;
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		count <= 4‘b0001;   //注意复位状态
	else
		count <= {count[2:0], count[3]};  //向左依次循环
end

2.1 移位寄存器首尾相连构成环形计数器

这种电路的问题在于自锁,无法自启动
verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

对输出端进行反馈到输入,把Q2、Q1、Q0或非接到D0端,这样就能自启动了。

verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

状态转移图如下所示。

verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

三、扭环形计数器/Johnson计数器(n位 2*n状态)

1000-1100-1110-1111-0111-0011-0001-0000-1000
相邻两个数之间只有1bit位不同,比较可靠,不存在竞争冒险

reg [3:0] count;
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		count <= 0;
	else
		count <= {~count[0], count[3:1]}; //这里是往右循环的计数
end

3.1 移位寄存器来构成扭环形计数器

verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

四、格雷码计数器

分为三个部分:格雷码转二进制、二进制加法、二进制转格雷码。文章来源地址https://www.toymoban.com/news/detail-466196.html

module gray_counter(
   input   clk,
   input   rst_n,

   output  reg [3:0] gray_out
);

	reg [3:0] bin;
	wire [3:0] gray_r;
	reg [3:0] bin_add;
	
	always@(posedge clk or negedge rst_n)begin
	    if(!rst_n)
	        bin<=0;
	    else begin
	        bin[3]=gray_r[3];
	        bin[2]=gray_r[2]^bin[3];
	        bin[1]=gray_r[1]^bin[2];
	        bin[0]=gray_r[0]^bin[1];
	    end
	end
	
	always@(posedge clk or negedge rst_n)begin
	    if(!rst_n)
	        bin_add<=0;
	    else 
	        bin_add<=bin+1'b1;
	end
	
	assign gray_r = (bin_add>>1) ^ bin_add;
	
	always@(posedge clk or negedge rst_n)begin
	    if(!rst_n)
	        gray_out<=0;
	    else 
	        gray_out<=gray_r;
	end
endmodule

到了这里,关于verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(56)
  • 【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

    目录 Ⅰ. 理论部分 0x00 升降计数器(UP DOWN Counter) 0x01 波纹计数器(Ripple Counter)

    2024年02月05日
    浏览(50)
  • verilog计数器

    (1) 深入了解计数器原理 (2) 学习使用 Verilog 实现同步计数器 ( 模八) 计数器的功能是记忆脉冲个数,它是数字系统中应用最为广泛的时序逻辑构件。 下图为设计 计数器从0开始每隔25_000_000个时钟周期(0.25秒)数码管末位显示加一,最大值为7,7后复0值              这

    2024年02月05日
    浏览(61)
  • 【Verilog基础】7.计数器

    如果是电平触发的话,只需要把posedge clk 换成reset or clk 就可以了; Johnson 计数器是一种数字电路, 具有以反馈方式连接的一系列触发器。 如果位数为N,则Verilog Johnson计数器是对2N个状态进行计数的计数器。 该电路是一种特殊类型的移位寄存器, 中最后一个触发 器的补码输出

    2024年02月13日
    浏览(44)
  • Verilog实现按键计数器

    一、简介 计数器我们都知道,这里我们旨在使用Verilog HDL 来实现按键计数器的操作,功能有: 1、按下一个键,计数加一(+1); 2、按下另一个键,计数减一(-1); 3、按下复位键,则计数清零。 4、最多计数60次。 二、 代码实现 我们使用了两个模块,第一个是按键消抖模

    2024年02月04日
    浏览(48)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(62)
  • 【Verilog异步清零计数器】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本人只是初学,代码经过实验验证,仅供参考 我自己查找模仿编写运行的代码,如有侵权,联系删除。 这是异步清零+控制加减法+进位指示灯的计数器 代码如下(示例): 这个程序适合已经了解书本例

    2024年02月11日
    浏览(45)
  • Verilog基础之十、计数器实现

    目录 一、前言 二、工程设计 2.1 设计代码 2.2 综合结果 ​2.3 仿真结果     计数器是较为基础的逻辑,很多其他逻辑可依靠计数器实现,如控制器,分频。原理为通过统计时钟脉冲的个数来输出计数值。 工程设计以计数20的计数器为例 测试代码 综合后的网表可知,6位的计

    2024年02月09日
    浏览(48)
  • 用verilog写一个60进制计数器

    你好!下面是一个使用 Verilog 写的 60 进制计数器的示例代码。这个计数器有四个输入: clock :时钟信号。 reset :当设为高电平时,计数器会重置为 0。 enable :当设为高电平时,计数器才会执行计数操作。 count_up :当设为高电平时,计数器会执行加 1 操作;当设为低电平时

    2024年02月11日
    浏览(49)
  • 通过verilog实现模可变计数器的设计

    实验要求:          (一) 实验目的 (1)掌握组合逻辑电路和时序电路的 FPGA实现方法; (2)熟悉EDA开发板和开发软件的使用方法; (3)学习静态数码管的使用和7段数码显示译码器设计; (4)掌握时钟在时序电路中的作用; (5)掌握分频电路的实现方法。 (二)

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包