2019年10月6日10時07分26秒
CORDIC分割原理は、それらを繰り返すことはしません。
MATLAB(条件:除数が2倍以上の配当することはできません)。
機能div_res = cordic_div(frac_up、frac_down、ループ) %INTIAL div_res = 0。 値= 1。 %CORDIC I = 0:ループ1 - ((frac_down * frac_up)<0)であれば x_new = frac_down。 y_new =(frac_up + frac_down)* 2。 frac_down = x_new。 frac_up = y_new。 div_resの=のdiv_res -値* 2 ^ -i。 他 x_new = frac_down。 y_new =(frac_up - frac_down)* 2。 frac_down = x_new。 frac_up = y_new。 div_res = div_res +値* 2 ^ -i。 エンド エンド エンド
FPGA実装のアイデアに対応します:
1)実装され、対応するRSTリセットを初期化します。
2)(frac_down * frac_up)<0実装XORを使用して、
3)反復は、+レジスタ・セットを生成使用して実装、単一のサブルーチンの各反復単位形態。
シフトにより実現4)2 ^ -i、及び* 2、。
対応する配列:
に対応するFPGAコード:
TB
`タイムスケール1nsの/ 1PS モジュールTB。 / ************* PARAMETER ****************** / パラメータが= 15ループ。 パラメータDATWIDTH = 16。 パラメータRESWIDTH = 12。 / ****************入力OUTOUT ************ / ロジック署名[DATWIDTH - 1:0] fracDown。 ロジックは、[DATWIDTHを- 1:0]が署名さfracUp。 ロジックは、[RESWIDTH - 1:0]が署名さdivResと、 / **************** INITIAL ***************** / 論理CLK。 ロジックRST; 初期始まる CLK = 0; RST = 1'b1の。 fracDown = 0; fracUp = 0; #20 RST = 1'b0この; #200 fracDown = 16'd200。 fracUp = -16'd40。 #1000 $ストップ。 最後 常に#2のCLK = CLK!; / **************** CORDIV ****************** / cordic_div#( .LOOPS(LOOPS)、 .DATWIDTH(DATWIDTH )、 .RESWIDTH(RESWIDTH) ) Ucordic_div( .clk(CLK)、 .rst(RST)、 .fracDown(fracDown)、 .fracUp(fracUp)、 .divRes(divRes) )。 glblのglbl()。 ENDMODULE
cordic_div
モジュールcordic_div(CLK、RST、fracDown、fracUp、divRes)。 / ********** PARAMETER ************** / パラメータが= 15ループ。 パラメータDATWIDTH = 16。 パラメータRESWIDTH = 12。 / ********** INPUT出力*********** / 入力CLK。 入力RST; 入力が符号付き[DATWIDTH - 1:0] fracDown。 入力は[DATWIDTHを- 1:0]が署名さfracUp。 出力ワイヤは[RESWIDTH - 1:0]が署名さdivResと、 / ********** CORDIC ***************** / //管路 線が署名[LOOPS:0] [DATWIDTH - 1:0] fracDown1。 ワイヤが署名[LOOPS:0] [DATWIDTH - 1:0] fracUp1。 ワイヤが署名[LOOPS:0] [RESWIDTH - 1:0] divRes1。 // INITIAL 割り当てfracDown1 [0] = fracDown。 割り当てfracUp1 [0] = fracUp。 割り当てdivRes1 [0] = {RESWIDTH {1'b0この}}。 genvar II; 生成する ための式(II = 0; II <LOOPS; II = II + 1) 開始:cordic_ii cordiv_unit位( .DATWIDTH(DATWIDTH)、 .RESWIDTH(RESWIDTH)、 .STAGE(II) ) Ucordiv_unit( .clk(CLK) 。RST(RST)、 .xin(fracDown1 [II])、 .yin(fracUp1 [II])、 .zin(divRes1 [II])、 .xout(fracDown1 [II + 1])、 .yout(fracUp1 [II + 1])、 .zout(divRes1 [II + 1]) )。 エンド endgenerateは divRes = divRes1 [LOOPS]を割り当てます。 ENDMODULE
cordiv_unit
モジュールcordiv_unit(CLK、RST、XIN、陰、ZIN、XOUT、YOUT、ZOUT)。 / *************** PARAMETER ******************** / パラメータDATWIDTH = 16。 パラメータRESWIDTH = 12。 パラメータSTAGE = 0。 パラメータVALUE = 12'h400。 / ************** INPUT出力****************** / 入力CLK。 入力RST; 入力は[DATWIDTH - 1:0]が署名されたXINと、 入力は[DATWIDTH - 1:0]が署名された陰と、 入力は[RESWIDTH - 1:0]が署名されたZINと、 出力REGは[DATWIDTH - 1:0]が署名されたXOUTと、 出力ワイヤは[DATWIDTH - 1:0]が署名さYOUTと、 出力REGは[RESWIDTH - 1:0]が署名さZOUTを、 / ************** CORDIC UINIT ******************* / REG [DATWIDTH - 1:0] yout1。 常に@(posedgeのCLK)開始 (RST)が始まる場合 XOUT <= {DATWIDTH {1'b0この}}。 yout1 <= {DATWIDTH {1'b0この}}。 ZOUT <= {RESWIDTH {1'b0この}}。 終了 始める他 <= XINをXOUT。 ( - ^陰[DATWIDTH - 1] XIN [1 DATWIDTH])場合に開始 yout1を<=陰+ XIN。 ZOUT <= ZIN - (VALUE >> STAGE)。 エンド 他は始まる yout1 <=陰- XIN。 ZOUT <= ZIN +(VALUE >> STAGE)。 エンド エンド エンドは YOUT = {yout1 [DATWIDTHを- 1]、yout1 [DATWIDTH - 3:0]、1'b0この}割り当てます。 ENDMODULE
シミュレーション結果:
即ち-40/200 = 0.2、シミュレーション結果:-205/1024(2 ^ 10)= -0.2002、シミュレーション正確。
モジュール遅延は:= 15 CLKループ。