wire和reg型變數的組合使用

来源:https://www.cnblogs.com/electricdream/p/18100250
-Advertisement-
Play Games

模型功能 實現寄存器之間的連線 實現寄存器的聲明 建構時鐘的時序系統 模型框圖 `timescale 1ns / 1ps /* */ // ******************************************************************************* ...


模型功能

  • 實現寄存器之間的連線
  • 實現寄存器的聲明
  • 建構時鐘的時序系統

模型框圖

`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

調用介面

  • 非封裝模型,無調用介面
========       ======\\            =======               -
||             ||     \\          //     \\             /-\
||             ||      ||        //                    // \\
||             ||     //        ||                    //   \\
======         =======          ||      ===          ========
||             ||               ||        \\        //       \\
||             ||                \\        ||      //         \\
||             ||                 \\      //      //           \\
||             ||                  =======       //             \\

作者:綠葉落秋風,專註FPGA技術分析和分享,轉載請註明原文鏈接:https://www.cnblogs.com/electricdream/p/18100250,文中資源鏈接如下:

1. GITHUB開源倉庫
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網頁圖像漸變的方法(HTML+CSS)(漸變與切換) Date: 2024.03.27 參考 色彩 runoob-漸變色工具 漸變 - 水平多圖 效果 HTML <div class="conBox pubCon"> <div class="imgBox"> <img class="img1" sr ...
  • 一、是什麼 CDN (全稱 Content Delivery Network),即內容分髮網絡 構建在現有網路基礎之上的智能虛擬網路,依靠部署在各地的邊緣伺服器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網路擁塞,提高用戶訪問響應速度和命中率。CDN 的關鍵技術主 ...
  • 一、是什麼 DNS(Domain Names System),功能變數名稱系統,是互聯網一項服務,是進行功能變數名稱和與之相對應的 IP 地址進行轉換的伺服器 簡單來講,DNS相當於一個翻譯官,負責將功能變數名稱翻譯成ip地址 IP 地址:一長串能夠唯一地標記網路上的電腦的數字 功能變數名稱:是由一串用點分隔的名字組成的 Int ...
  • 今天讀到阮一峰的293期周刊,其中有句話很讓我震動——“一周是一年的2%”。 過去的時間里,我都沒有在意時間的流逝,過的好的時候就覺得一周過的好快,周三一過這周也就過去了,過的不好的時候就感覺很漫長。 確實,我們沒有幾周可以虛度的,多浪費幾周,一年就過去了。 我努力將每一周過好,那麼這2%就有價值了 ...
  • 提到這個 %20,想必大家都見過,熟悉一點編碼的人,還會知道這玩意就是空格轉換而來! 那麼我們一起破解, 如何編碼而來? ...
  • 你知道v-model指令是如何變成組件上的modelValue屬性和@update:modelValue事件呢?這一過程是在編譯時還是運行時進行的呢? ...
  • IO
    IO 所有輸入流的基類:InputStream / Reader 所有輸出流的基類:OutputStream / Writer 位元組流 InputStream常用方法:read(), skip(), available(), close() FileInputStream DataInputStre ...
  • 拓展閱讀 blog-engine-01-常見博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 對比 blog-engine-02-通過博客引擎 jekyll 構建 github pages 博客實戰筆記 blog-engi ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...