Verilog Generate可以實現批量的信號定義與賦值、模塊例化


對於相關器(Correlator)電路,它對兩個輸入信號在一定窗口范圍內進行乘積,然后對積進行疊加作為輸出。如果需要低延時的相關器輸出,就需要將每一個采樣值作為被乘數(根據實際需要的過采樣率來決定抽頭個數)。一般這樣的相關器會消耗更多的資源。

相關器實現的結構如圖:

要實現這樣的相關器,一種可行的做法是用MATLAB/C程序,產生期望的大量的格式化代碼保存在.v文件,然后用`include把這段代碼放到需要的地方(比如wire聲明,reg聲明,assign賦值,always里面<=賦值)。注意在工程中,將這些.v文件作為頭文件而不是設計文件來管理(否則編譯器認為語法出錯)。這樣做的缺點是:每一段代碼需要用一個.v文件保存,而且每次進行代碼修改都需要運行MATLAB/C程序。

Verilog有generate結構可以實現上述的“代碼堆疊”操作。

上面的結構圖中有3個地方可以generate:1、d1信號的采樣移位。2、d2信號的采樣移位。3、乘法器組。

模塊的關鍵參數:1、N=30,為移位寄存器的階數。2、每一級移位寄存器是5-bit Signed乘法器。3、din_shift_reg是二位數組的定義形式,即reg signed[4:0] din_shift_reg[29:0]。

給出移位寄存器的generate實現:

//***    Shift Operation
genvar ite_din;
generate
    for(ite_din=0; ite_din<N; ite_din=ite_din+1)begin: din_op  // 記得for結構需要用begin開頭,並且為generate結構加標識符,如din_op
        always@(posedge ts_sam_clk)begin
            if(!rst_n)begin
                din_shift_reg[ite_din] <= 5'd0;
            end
            else begin
                if((N-1) == ite_din)begin
                    din_shift_reg[ite_din] <= din;  // New Data In-Buff
                end
                else begin
                    din_shift_reg[ite_din] <= din_shift_reg[ite_din+1];  // Shift Operation
                end
            end
        end
    end  // 記得for結構需要end結尾
endgenerate

給出乘法器的generate實現:

//***    Generate Multiplier
genvar ite_mult;
generate
    for(ite_mult=0; ite_mult<N; ite_mult=ite_mult+1)begin: mult_op
        mult_s5 mult_s5_inst(
        .clock(ts_sam_clk),
        .dataa(din_shift_reg[ite_mult]),
        .datab(local_reg[ite_mult]),
        .result(prod[ite_mult])
        );
    end
endgenerate

說明和一些理解:generate結構將其內部的結構例化/生成多次,各個結構的參數可以通過genvar進行配置。

等效的結構圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM