wire和reg型变量的组合使用

这篇具有很好参考价值的文章主要介绍了wire和reg型变量的组合使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型功能

  • 实现寄存器之间的连线
  • 实现寄存器的声明
  • 建构时钟的时序系统

模型框图

`timescale 1ns / 1ps
/*

*/
// *******************************************************************************
// Company: Fpga Publish
// Engineer: FP 
// 
// Create Date: 2024/03/24 12:39:43
// Design Name: 
// Module Name: verilog_demo
// Project Name: 
// Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
// Tool Versions: 2021.1 || 2022.2
// Description: 
//         * 
// Dependencies: 
//         * 
// Revision: 0.01 
// Revision 0.01 - File Created
// Additional Comments:
// 
// *******************************************************************************
module verilog_demo #(
    //mode
    parameter MD_SIM_ABLE = 0,
    //number
    parameter NB_DELAY_CLK = 100,
    //width
    parameter WD_ERR_INFO = 4
   )(
    //! system signals
    input           i_sys_clk   ,  
    input           i_sys_resetn,  
    //! @virtualbus uart_interface @dir out
    output          m_uart_0_mtx, //! uart master tx
    input           m_uart_0_mrx, //! uart master rx
    //! @end 
    //! error info feedback
    output   [WD_ERR_INFO-1:0]  m_err_verilog_info1
);
//========================================================
//function to math and logic

//========================================================
//localparam to converation and calculate

//========================================================
//register and wire to time sequence and combine
// ----------------------------------------------------------
// demo variable
reg        [1:0] r_dat0 = 0;
reg signed [1:0] r_dat1 = 0;
wire       [1:0] w_dat2;
reg        [1:0] r_fifo [0:1]
wire       [1:0] w_array [0:1];

//========================================================
//always and assign to drive logic and connect

//========================================================
//module and task to build part of system

//========================================================
//expand and plug-in part with version 

//========================================================
//ila and vio to debug and monitor

endmodule
              
/* end verilog

*/

实现步骤

  1. 声明寄存器
  • reg类型变量实际上是对FF(除法器)的快速声明方法
  • 使用FDCE的原语可以实现寄存器的准确描述,但是比较少用
   FDCE #(
      .INIT(1'b0),            // Initial value of register, 1'b0, 1'b1
      // Programmable Inversion Attributes: Specifies the use of the built-in programmable inversion
      .IS_CLR_INVERTED(1'b0), // Optional inversion for CLR
      .IS_C_INVERTED(1'b0),   // Optional inversion for C
      .IS_D_INVERTED(1'b0)    // Optional inversion for D
   )
   FDCE_inst (
      .Q(Q),     // 1-bit output: Data
      .C(C),     // 1-bit input: Clock
      .CE(CE),   // 1-bit input: Clock enable
      .CLR(CLR), // 1-bit input: Asynchronous clear
      .D(D)      // 1-bit input: Data
   );
  • 其中位宽的作用是声明多个FDCE组合成寄存器组,实现多bit数据的处理
  • 默认值的就是快速输入原语中的INIT值
  • 原语中的其他描述则会在always逻辑中体现,本章不展开
  1. wire线的连接
  • 从硬件上理解,wire就是各个器件之间的走线
  • 从高级语言的角度理解,wire就是等式的右边部分的缩写
  • 也就是说,wire并不是C语言中的变量,而是等式的右边,用于描述某些中间过程
  1. 二维reg变量的使用
  • 如模型描述中的r_fifo,可以允许输入地址去访问类数组结构
  • 该二维reg变量实际上依靠DRAM实现,地址由查找表实现,受限于查找表的大小一般为64bit,所以二维变量地址不能太大
  • 一般器件将地址深度控制在256以内,这个和器件底层LUT级联单元有关(当然也和时序有关,时序要求越低,支持数目越多)
  • 需要注意的是,严禁使用三维reg变量
    • 三维reg变量是指地址受到两个reg变量的访问
    • 从其映射关系可以知道,三维reg变量形成的是两个reg变量位宽相乘的查找表数量
    • 除非两个变量的位宽都很小,且时序要求很低,否则极有可能出现计算异常(本人已经多次验证过,仿真没有问题,但是实际运行异常)
    • 而且,可以通过简单地提前一个周期计算地址的方法完成维度的降低,完全没有必要使用这种延时大、条件严格的结构
  1. 二维阵列的使用
  • 如模型描述的w_array,可以允许输入地址去访问数据的特定位宽
  • 是的,和二维变量的区别是,w_array是走线集合,而不是硬件结构
  • wire [8-1:0] x [0:2-1] 和 wire [8*2-1:0]属于一个性质,只不过对应关系有所差异
  • 一般二维阵列就是配合二维变量,在级联结果中形成同步的信号缓存
  1. 级联一维变量的使用
  • 并不是所有类似r_fifo的变量都是二维reg变量
  • 这个取决于该变量的地址控制方式
  • 当使用常数控制地址访问时,其更多是作为级联变量使用
  • 但是从使用效果来说,和二维变量无区别,所以可以全部用fifo进行标记
  • 在本集合的第三篇时就使用过级联变量,本质上也是一种缩写,而非特殊的硬件结构
  1. 寄存器之间的传递
  • 理论上,可以使用reg完成所有的寄存器的描述
  • 但是为了灵活,还是需要用wire缓存一些中间结果,以免出现大量的重复代码
  • 也就是存在下列传递关系:
    • reg --> wire (assign)
    • wire --> reg (always)
    • wire --> wire (assign)
    • reg --> reg (always)
  • 端口列表在传递时均为wire,可以直接连接,通过input和output进行方向区分

最终效果

wire和reg型变量的组合使用文章来源地址https://www.toymoban.com/news/detail-843946.html

module adder_cascade#(
    parameter NB_CASCADE = 4,
    parameter WD_DAT = 4 
    )(
    input i_clk,
    input  [WD_DAT-1:0] a,
    output [WD_DAT-1:0] s,
    output [WD_DAT*NB_CASCADE-1:0] o_dat
    );
wire [WD_DAT-1:0] a_array [0:NB_CASCADE]; //add 1 bit for input
reg [WD_DAT-1:0] r_fifo [0:NB_CASCADE-1]; //add 1 bit for input
assign a_array[0] = a;
assign s = a_array[NB_CASCADE];
generate genvar i;
for(i = 0; i < NB_CASCADE; i = i + 1)
    begin: FOR_NB_CASCADE
        adder #(
            .WD_DAT(WD_DAT)
        )u_adder(
            .a(a_array[i]),
            .s(a_array[i+1])
        );
        always@(posedge i_clk)
        begin
            r_fifo[i] <= a_array[i];
        end 
        assign o_dat[WD_DAT*(i+1)-1:WD_DAT*i] = r_fifo[i];
    end 
endgenerate 
endmodule

调用接口

  • 非封装模型,无调用接口

到了这里,关于wire和reg型变量的组合使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • verilog基础语法,wire,reg,input,output,inout

    概述: 输入输出是模块的端口,寄存器是数据存储介质,线用于把各个电路关联起来,形成一个数据流通通道,进行形成具有具体功能的电路模块。线是信息关联与传递的介质,也是可以称为信息流通的管道。在FPGA中的基本定义为wire,reg,input,output,inout。只有正确的认识到

    2024年04月24日
    浏览(42)
  • 数字逻辑电路设计例化模块输入输出,何时用reg,何时用wire?

    初学者应该总会遇到这个问题,许多资料都介绍的是:        reg  寄存器类型可以存储数据,wire 是一根线,不能存储保持数据,是如此,但是在例化模块,或者调用通用的fifo模板,算法模板时候,难免经常连线,用寄存器打拍~~~        下图中,绿色部分是子模块,灰色

    2024年02月12日
    浏览(41)
  • 【Linux 设备驱动系列 4 -- 设备树 64bit 寄存器 reg 属性描述 】

    address-cells:address要用多少个32位数来表示; size-cells:size 要用多少个32位数来表示。 32bit 寄存器 reg 属性描述 在 Linux 设备树(Device Tree)语法中,\\\" reg \\\"和\\\" reg-names \\\"属性是用于描述设备资源的主要属性。 \\\" reg \\\"属性用于描述设备的物理地址和大小。它是一个32位或64位的整数数

    2024年02月16日
    浏览(54)
  • Verilog给reg型变量赋初值

    在使用Verilog进行开发时,有的reg型变量需要赋初值。经过尝试,有三种方法可以实现给reg变量赋初值。(测试使用的是EP4CE6E22C8开发板,测试时使用串口将变量值发给上位机。) 1、在定义reg变量时赋初值: 2、复位时给reg变量赋值; 3、用initial语句赋初值: 但是很多资料说

    2024年02月11日
    浏览(38)
  • 《C和指针》笔记12: 存储类型(自动变量、静态变量和寄存器变量)

    在 代码块内部声明的变量 的缺省存储类型是自动的(automatic),也就是说它存储于堆栈中,称为自动(auto)变量 。auto就是用于修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量。 在程序执行到声明自动变量的代码块时,自动变量才被创

    2024年02月10日
    浏览(43)
  • 使用VCS的ralgen命令产生UVM的寄存器模型的操作步骤

    1.根据reg.csv(寄存器的SPEC)文件生成一个reg.ralf文件,这个文件有特定的脚本生成(我目前不会),当然也可以自己手写(如果寄存器比较小)   寄存器的SPEC reg.ralf文件  2.\\\".ralf\\\"文件的格式  3.有reg.ralf文件之后,编写一个生成寄存器模型的Makefile文件 4.直接在terminal上 make genreg 便可产

    2024年02月03日
    浏览(43)
  • 入门孪生网络3-------使用一维卷积神经网络1DCNN与孪生网络的组合模型来实现excel数据的分类

    读取数据:使用NumPy加载数据文件(假设为\\\" data.csv \\\"),并将其分为训练集和测试集。 定义1D卷积神经网络模型:通过创建get_cnn_model()函数来定义1DCNN模型,该模型包括一系列卷积层和池化层,以及最后的全连接层输出。这个模型将用于构建孪生网络模型的多个分支。 定义孪

    2024年02月09日
    浏览(51)
  • GreenHills基本操作:通过 R寄存器和上下文变量 定位异常

    单片机开发大部分属于C开发,因C开发的灵活性,经常导致系统内存被踩(比如:数组越界),操作异常(非对齐地址的操作:对非4字节对齐地址进行32bit赋值操作)。 这些异常问题,基本藏得很深,配查难度打,所以,我们必须要采用一套便于我们分析的方法,来辅助我们

    2024年02月06日
    浏览(42)
  • 使用FPGA实现桶形移位寄存器

    我给大家介绍的是逻辑/算术左移移位寄存器。实现的功能是根据输入信号shift将输入信号进行移位,高位移除,低位补0。我建立的工程是由3个独立的桶形移位寄存器组成的。 library ieee; use ieee.std_logic_1164.all; entity barrel is      port( inp : in std_logic_vector(7 downto 0);          

    2024年04月29日
    浏览(47)
  • 电脑键盘快捷键和组合键功能使用大全

    一、最常用的电脑快捷键大全 二、电脑快捷键大全键和组合键功能大全 Ctrl+1,2,3... 功能:切换到从左边数起第1,2,3...个标签 Ctrl+A 功能:全部选中当前页面内容 Ctrl+C 功能:复制当前选中内容 Ctrl+D 功能:打开“添加收藏”面版(把当前页面添加到收藏夹中) Ctrl+E 功能:打开或关

    2024年02月11日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包