Verilog基础:寄存器输出的两种风格

这篇具有很好参考价值的文章主要介绍了Verilog基础:寄存器输出的两种风格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关文章

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        Verilog中的寄存器操作一般指的是那些对时钟沿敏感而且使用非阻塞赋值的操作。例如状态机中的状态转移,实际上就是一种寄存器操作,因为这相当于将下一状态的组合逻辑连接至寄存器的输入,如图一的Moore状态机所示。

Verilog基础:寄存器输出的两种风格,Verilog基础,fpga开发,数字IC,硬件工程,Verilog

图1 Moore型状态机

        对于这种的寄存器操作,三段式的描述方式清清晰明了地将组合逻辑和寄存器操作分离,所以被广泛接受的,如下所示。

//第一段,下一状态组合逻辑
always@(*) begin
	case (state)                     
		***: next_state = ***;
		***: next_state = ***;
	endcase
end
 
//第二段,状态转移时序逻辑
always @(posedge clk, negedge rst_n) begin
	if (!rst_n)     
        state <= ***;		             
    else 
        state <= next_state;			
end
 
//第三段,输出组合逻辑
always@(*) begin
    if(state == ***)
        out = ***;
    else
        out = ***;
end

        但对于需要输出寄存的情况,就可能出现两种不同的描述寄存器操作的风格,一种是组合逻辑和寄存器操作分离,就像状态转移一样,另一种是将组合逻辑和寄存器操作混合在一起。下面是一个简单的例子。

//将输出组合逻辑和输出寄存分离
//第一段,下一状态组合逻辑
always@(*) begin
	case (state)                     
		***: next_state = ***;
		***: next_state = ***;
	endcase
end
 
//第二段,状态转移时序逻辑
always @(posedge clk, negedge rst_n) begin
	if (!rst_n)     
        state <= ***;		             
    else 
        state <= next_state;			
end
 
//第三段,输出组合逻辑
always@(*) begin
    if(state == ***)
        out = ***;
    else
        out = ***;
end

//第四段,输出寄存时序逻辑
always @(posedge clk, negedge rst_n) begin
	if (!rst_n)     
        out_r <= ***;		             
    else 
        out_r <= out;			
end
endmodule
​
//将输出组合逻辑和输出寄存融合
//第一段,下一状态组合逻辑
always@(*) begin
	case (state)                     
		***: next_state = ***;
		***: next_state = ***;
	endcase
end
 
//第二段,状态转移时序逻辑
always @(posedge clk, negedge rst_n) begin
	if (!rst_n)     
        state <= ***;		             
    else 
        state <= next_state;			
end
 

//第三段,输出寄存时序逻辑
always @(posedge clk, negedge rst_n) begin
	if (!rst_n)     
        out_r <= ***;		             
    else 
        out_r <= ***;			
end
endmodule

        对于状态机简单的输出寄存,可以将输出组合逻辑和输出寄存融合,比如计数器(对计数器而言状态就是输出,所以也可以理解为将状态转移也融合进来了)。同时对于一般简单的寄存器操作比如移位,也可以将输出组合逻辑和输出寄存融合。文章来源地址https://www.toymoban.com/news/detail-764562.html

//组合逻辑和寄存器操作融合
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        cnt <= 0;
    else
        cnt <= cnt + 1;
end

//组合逻辑和寄存器操作不融合
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        cnt <= 0;
    else
        cnt <= cnt_pre;
assign cnt_pre = cnt + 1;
end

//简单的寄存器操作,组合逻辑和时序逻辑融合
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        shift <= 0;
    else if(load)
        shift <= shift_load;
    else
        shift <= shift << 1;
end

//简单的寄存器操作,组合逻辑和时序逻辑不融合
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        shift <= 0;
    else if(load)
        shift <= shift_load;
    else
        shift <= shift_pre;
end

assign shift_pre = shift << 1;

到了这里,关于Verilog基础:寄存器输出的两种风格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

    【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

      目录 Ⅰ. 理论部分 0x00 移位寄存器(Shift Register) 0x01 环形计数器(Ring Counter)

    2024年02月05日
    浏览(37)
  • hdlbits系列verilog解答(8位宽移位寄存器)-24

    这项练习是module_shift移位寄存器的延伸。模块端口不是只有单个引脚,我们现在有以向量作为端口的模块,您将在其上附加线向量而不是普通线网数据。与 Verilog 中的其他位置一样,端口的向量长度不必与连接到它的导线匹配,但这会导致向量的零填充或截断。本练习不使用

    2024年02月08日
    浏览(8)
  • Verilog学习笔记——时序逻辑(shift register移位寄存器)

    Verilog学习笔记——时序逻辑(shift register移位寄存器)

    1. 4位移位寄存器  4-bit shift register 2. Left/ right register 左移|右移寄存器(1位)   3. Left/right arithmetic shift by 1 or 8 算数 左移|右移寄存器(1 或8位) 4. 5-bit LFSR 5. 3-bit LFSR   6. 32-bit LFSR   7. Shift register 8. Shift register    9. 3-input LUT  

    2024年02月03日
    浏览(9)
  • STM32 寄存器配置笔记——GPIO配置输出

    STM32 寄存器配置笔记——GPIO配置输出

           本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。         1)GPIO外设时钟          通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,

    2024年01月24日
    浏览(18)
  • Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    参考文献1 不简单的进行移位,而是在移位的基础上加上异或门,如题目所示,这就相当于每进行一次移位,寄存器中的值会发生改变,一直移动,一直改变,就形成了伪随机数。

    2024年02月09日
    浏览(14)
  • m基于FPGA的桶形移位寄存器verilog实现,包含testbench

    m基于FPGA的桶形移位寄存器verilog实现,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1、桶形移位寄存器的基本原理 2.2、桶形移位寄存器的数学模型 2.3、桶形移位寄存器的实现步骤 3.Verilog核心程序 4.完整算法代码文件 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition 其

    2024年02月04日
    浏览(12)
  • Verilog语言中的线型wire变量与寄存器类型reg变量讲解

    (1)创建wire线型 (2)在always块中要赋值的不能是wire类型,只能是reg类型 (3)输入类型不能是reg类型 (4)输出reg类型,但没有触发条件时,软件会自动将触发器综合掉

    2024年02月16日
    浏览(9)
  • 【六一】【海思SS528】GPIO寄存器操作 - 使能GPIO管脚输出高、低电平

    【六一】【海思SS528】GPIO寄存器操作 - 使能GPIO管脚输出高、低电平

    这篇文章根据海思SS528芯片提供的 《22AP30 H.265编解码处理器用户指南.pdf》 文档(文档路径: SS528ReleaseDochardwarechip ),演示怎样操作GPIO寄存器来控制某个IO口输出高电平,本文控制的是 GPIO20_6 。 关于如何操作寄存器的步骤,在文档的 13.6.3 有提供说明,结合本文目的分为三个

    2024年02月08日
    浏览(7)
  • 【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

    【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

    这篇文章主要介绍在 海思SS528 开发板,去操作某个 GPIO 寄存器输出高、低电平,来熄灭或点亮 LED 灯。 首先,了解一下 ARM裸机编程 ,也就是在一块没有移植操作系统的ARM开发板去编程,相当于把它当成单片机去使用,很多与硬件相关的操作都需要直接读写该硬件的寄存器。

    2024年02月10日
    浏览(7)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

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

    2024年02月10日
    浏览(89)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包