首页 > 其他分享 >wire和reg型变量的组合使用

wire和reg型变量的组合使用

时间:2024-03-27 21:55:34浏览次数:24  
标签:WD 变量 wire input bit 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进行方向区分

最终效果

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

调用接口

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

标签:WD,变量,wire,input,bit,reg
From: https://www.cnblogs.com/electricdream/p/18100250

相关文章

  • 2-15. 绑定 Editor Window 中的参数变量
    点击左侧的东西时同步右侧的内容修改图片项目相关代码代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git标签:20240327_2028......
  • [docker] 浅谈Docker:Docker容器中环境变量的应用
    0序1设置环境变量1.1场景:在Dockerfile中设置环境变量在构建Docker镜像时,可以在Dockerfile中使用ENV指令来设置环境变量ENVMY_ENV_VAR="ABC123"ENV指令用于设置环境变量,语法为ENV<key><value>ENV<key>=<value>1.2场景:使用dockerrun命令设置环境变量使用d......
  • python全局变量和局部变量
    #!/usr/bin/python#-*-coding:UTF-8-*-#可写函数说明defprintinfo(kname,age):"打印任何传入的字符串"print("Name:",kname)print("Age",age)return#调用printinfo函数printinfo(age=50,kname="miki")#!/usr/b......
  • (less) calc运算为什么不生效? 变量如何使用?
    less样式预处理器calc运算为什么不生效?变量如何使用?======答案如下见代码:<template><divclass="outer"><divclass="top"></div><divclass="box">helloworld</div><divclass="con"><......
  • var定义的全局变量与window的属性的区别
    https://blog.csdn.net/2201_75705263/article/details/129916155关系所有JavaScript全局对象、函数以及变量均自动成为window对象的成员全局变量是window对象的属性。全局函数是window对象的方法区别1.全局变量不能通过delete删除deletea;而windo......
  • python变量
    python语法【1】注释语法便于开发人员了解代码含义如何添加注释单行注释:只对本行注释#注释多行注释:适用于代码块'''注释'''快捷键:ctrl/代码注释原则:只给特定的代码位置添加必要的注释可以英文,可以中文【2】变量和常量都是用来表示事物或......
  • Wireshark使用实训---分析IP包
    1.Wireshark简介和作用Wireshark是一个开源的网络分析工具,用于捕捉和分析网络数据包。它可以帮助网络管理员和安全专家监控和解决网络问题,同时也可以用于学习和教学网络通信原理。Wireshark可以在网络中捕获和分析传输的数据包,包括协议头部信息和数据负载。它支持多种网络协......
  • C/C++整形变量溢出问题
    参考C语言的整型溢出问题|酷壳-CoolShell   概述整形溢出分为无符号(unsigned)整型溢出和有符号(signed)整型溢出无符号整型溢出对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”比如,两个unsignedint类型求和溢出......
  • 第二讲 C语言中的数据类型和变量
    1数据类型介绍C语言提供了丰富的数据类型来描述生活中的各种数据。使用整形类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。下列是C语言提供的各种数据类型:1.1字符型char[signed]char //有符号的unsignedchar //无符号的1.2整型//短整型......
  • RDD缓存 检查点 共享变量 累加器
    1.缓存的基本介绍   缓存介绍:       1.当一个RDD的产生过程(计算过程),是比较昂贵的(生成RDD整个计算流程比较复杂),并且这个RDD可能会被多方(RDD会被重复使用)进行使用,      2.此时为了提升计算效率,可以将RDD的结果设置为缓存,这样后续在使......