簡化版的復數相關運算---Verilog
//************************************************************************************************************** //Function description: Simplify the complex multiplication operation to the addition operation //Input: clock,reset,counter,multiplier_Real,multiplier_Imag,known_Real,known_Imag //Output: output_Real,output_Imag /*參考《中山大學論文》,得將已知STS取共軛之后再與量化結果相乘*****////// //Example:conjugate{(a + i*b)}= (a - i*b) // conj{(a+i*b)}*(1+i) = (a+b)+i*(a-b) // conj{(a+i*b)}*(1-i) = (a-b)+i*(-a-b) // conj{(a+i*b)}*(-1+i)= (-a+b)+i*(a+b) // conj{(a+i*b)}*(-1-i)= (-a-b)+i*(-a+b) //************************************************************************************************************** `timescale 1ns/10ps module Simple_Correlation( input wire Clk, /*系統時鍾*****////// input wire Rst_n, /*系統復位信號******////// input wire inEn, input wire multiplier_Real, /*移位寄存器實部******////// input wire multiplier_Imag, /*移位寄存器虛部******////// input wire [15:0] known_Real, /*本地已知短訓練序列實部,二進制補碼表示*******/////// input wire [15:0] known_Imag, /*短訓練序列虛部*******/////// output reg [16:0] output_Real, /*輸出實部,擴展為17位輸出,輸出為二進制補碼表示*******/////// output reg [16:0] output_Imag, /*輸出虛部*******/////// output reg OutputEnable); //----------------------------------------------------------------------------------- /*輸入的multiplier等於0表示正數,等於1表示負數*****////// always @ (posedge Clk or negedge Rst_n) begin if (!Rst_n) begin output_Real <= 0; output_Imag <= 0; OutputEnable <= 0; end else if (inEn) begin OutputEnable <= 1; if (multiplier_Real == 0 && multiplier_Imag == 0) begin output_Real <= {{1{known_Real[15]}},known_Real} + {{1{known_Imag[15]}},known_Imag}; output_Imag <= {{1{known_Real[15]}},known_Real} - {{1{known_Imag[15]}},known_Imag}; end else if (multiplier_Real == 0 && multiplier_Imag == 1) begin output_Real <= {{1{known_Real[15]}},known_Real} - {{1{known_Imag[15]}},known_Imag}; output_Imag <= - {{1{known_Real[15]}},known_Real} - {{1{known_Imag[15]}},known_Imag}; end else if (multiplier_Real == 1 && multiplier_Imag == 0) begin output_Real <= - {{1{known_Real[15]}},known_Real} + {{1{known_Imag[15]}},known_Imag}; output_Imag <= {{1{known_Real[15]}},known_Real} + {{1{known_Imag[15]}},known_Imag}; end else //(buffer_multiplier_Real==1 && buffer_multiplier_Imag==1) begin output_Real <= - {{1{known_Real[15]}},known_Real} - {{1{known_Imag[15]}},known_Imag}; output_Imag <= - {{1{known_Real[15]}},known_Real} + {{1{known_Imag[15]}},known_Imag}; end end else begin output_Real <= 0; output_Imag <= 0; OutputEnable <= 0; end end endmodule