wire和reg型变量的组合使用

打印 上一主题 下一主题

主题 861|帖子 861|积分 2583

模型功能


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

`timescale 1ns / 1ps
/*
  1. */
  2. // *******************************************************************************
  3. // Company: Fpga Publish
  4. // Engineer: FP
  5. //
  6. // Create Date: 2024/03/24 12:39:43
  7. // Design Name:
  8. // Module Name: verilog_demo
  9. // Project Name:
  10. // Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
  11. // Tool Versions: 2021.1 || 2022.2
  12. // Description:
  13. //         *
  14. // Dependencies:
  15. //         *
  16. // Revision: 0.01
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. // *******************************************************************************
  21. module verilog_demo #(
  22.     //mode
  23.     parameter MD_SIM_ABLE = 0,
  24.     //number
  25.     parameter NB_DELAY_CLK = 100,
  26.     //width
  27.     parameter WD_ERR_INFO = 4
  28.    )(
  29.     //! system signals
  30.     input           i_sys_clk   ,  
  31.     input           i_sys_resetn,  
  32.     //! @virtualbus uart_interface @dir out
  33.     output          m_uart_0_mtx, //! uart master tx
  34.     input           m_uart_0_mrx, //! uart master rx
  35.     //! @end
  36.     //! error info feedback
  37.     output   [WD_ERR_INFO-1:0]  m_err_verilog_info1
  38. );
  39. //========================================================
  40. //function to math and logic
  41. //========================================================
  42. //localparam to converation and calculate
  43. //========================================================
  44. //register and wire to time sequence and combine
  45. // ----------------------------------------------------------
  46. // demo variable
  47. reg        [1:0] r_dat0 = 0;
  48. reg signed [1:0] r_dat1 = 0;
  49. wire       [1:0] w_dat2;
  50. reg        [1:0] r_fifo [0:1]
  51. wire       [1:0] w_array [0:1];
  52. //========================================================
  53. //always and assign to drive logic and connect
  54. //========================================================
  55. //module and task to build part of system
  56. //========================================================
  57. //expand and plug-in part with version
  58. //========================================================
  59. //ila and vio to debug and monitor
  60. endmodule
  61.               
  62. /* end verilog
复制代码
   */
实现步骤


  • 声明寄存器


  • reg类型变量实际上是对FF(除法器)的快速声明方法
  • 使用FDCE的原语可以实现寄存器的准确描述,但是比较少用
  1.    FDCE #(
  2.       .INIT(1'b0),            // Initial value of register, 1'b0, 1'b1
  3.       // Programmable Inversion Attributes: Specifies the use of the built-in programmable inversion
  4.       .IS_CLR_INVERTED(1'b0), // Optional inversion for CLR
  5.       .IS_C_INVERTED(1'b0),   // Optional inversion for C
  6.       .IS_D_INVERTED(1'b0)    // Optional inversion for D
  7.    )
  8.    FDCE_inst (
  9.       .Q(Q),     // 1-bit output: Data
  10.       .C(C),     // 1-bit input: Clock
  11.       .CE(CE),   // 1-bit input: Clock enable
  12.       .CLR(CLR), // 1-bit input: Asynchronous clear
  13.       .D(D)      // 1-bit input: Data
  14.    );
复制代码

  • 此中位宽的作用是声明多个FDCE组合成寄存器组,实现多bit数据的处理
  • 默认值的就是快速输入原语中的INIT值
  • 原语中的其他描述则会在always逻辑中体现,本章不展开

  • wire线的连接


  • 从硬件上理解,wire就是各个器件之间的走线
  • 从高级语言的角度理解,wire就是等式的右边部分的缩写
  • 也就是说,wire并不是C语言中的变量,而是等式的右边,用于描述某些中间过程

  • 二维reg变量的使用


  • 如模型描述中的r_fifo,可以允许输入地点去访问类数组布局
  • 该二维reg变量实际上依靠DRAM实现,地点由查找表实现,受限于查找表的巨细一般为64bit,所以二维变量地点不能太大
  • 一般器件将地点深度控制在256以内,这个和器件底层LUT级联单元有关(当然也和时序有关,时序要求越低,支持数目越多)
  • 需要注意的是,严禁使用三维reg变量

    • 三维reg变量是指地点受到两个reg变量的访问
    • 从其映射关系可以知道,三维reg变量形成的是两个reg变量位宽相乘的查找表数量
    • 除非两个变量的位宽都很小,且时序要求很低,否则极有大概出现计算异常(本人已经多次验证过,仿真没有问题,但是实际运行异常)
    • 而且,可以通过简单地提前一个周期计算地点的方法完成维度的降低,完全没有必要使用这种延时大、条件严格的布局


  • 二维阵列的使用


  • 如模型描述的w_array,可以允许输入地点去访问数据的特定位宽
  • 是的,和二维变量的区别是,w_array是走线集合,而不是硬件布局
  • wire [8-1:0] x [0:2-1] 和 wire [8*2-1:0]属于一个性质,只不过对应关系有所差异
  • 一般二维阵列就是配合二维变量,在级联结果中形成同步的信号缓存

  • 级联一维变量的使用


  • 并不是所有类似r_fifo的变量都是二维reg变量
  • 这个取决于该变量的地点控制方式
  • 当使用常数控制地点访问时,其更多是作为级联变量使用
  • 但是从使用结果来说,和二维变量无区别,所以可以全部用fifo进行标记
  • 在本集合的第三篇时就使用过级联变量,本质上也是一种缩写,而非特殊的硬件布局

  • 寄存器之间的传递


  • 理论上,可以使用reg完成所有的寄存器的描述
  • 但是为了机动,还是需要用wire缓存一些中间结果,以免出现大量的重复代码
  • 也就是存在下列传递关系:

    • reg --> wire (assign)
    • wire --> reg (always)
    • wire --> wire (assign)
    • reg --> reg (always)

  • 端口列表在传递时均为wire,可以直接连接,通过input和output进行方向区分
最闭幕果


[code]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 inputreg [WD_DAT-1:0] r_fifo [0:NB_CASCADE-1]; //add 1 bit for inputassign 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),            .s(a_array[i+1])        );        always@(posedge i_clk)        begin            r_fifo

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表