模型功能 實現寄存器之間的連線 實現寄存器的聲明 建構時鐘的時序系統 模型框圖 `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
*/
實現步驟
- 聲明寄存器
- 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邏輯中體現,本章不展開
- 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進行方向區分
最終效果
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開源倉庫