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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...