對於相關器(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進行配置。
等效的結構圖:

