除算を実行する001-CORDIC

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ループ。

 

 

おすすめ

転載: www.cnblogs.com/mia1004/p/11626879.html