基于cordic的arcsin的代码理解

cordic代码如下

module cordicArcsinArccos
(
    input CLOCK,RESET,
	 input iCall, 
	 output oDone,
	 input [31:0]iData,
	 output [31:0]arcsin,
	 output [31:0]arccos,
	 
	 output [31:0]q_deg,q_y,q_x
);
	  reg [31:0] atan [15:0];
	 
	 initial begin
	     atan[0] = 32'd2949120; atan[1] = 32'd1740992; atan[2] = 32'd919872; atan[3] = 32'd466944;
		  atan[4] = 32'd234368; atan[5] = 32'd117312; atan[6] = 32'd58688; atan[7] = 32'd29312; 
		  atan[8] = 32'd14656; atan[9] = 32'd7360; atan[10] = 32'd3648; atan[11] = 32'd1856; 
		  atan[12] = 32'd896;  atan[13] = 32'd448; atan[14] = 32'd256; atan[15] = 32'd128;
	 end
	 
	 reg signed [31:0]x,y,tx,ty,deg,gamma;
	 reg [7:0]i,k;
	 reg isDone,sigma;
	 
	 always @ ( posedge CLOCK or negedge RESET )
	     if( !RESET )
		       begin
						{ x,y,tx,ty,deg,gamma } <= { 32'd0,32'd0,32'd0,32'd0,32'd0,32'd0 };
						{ i,k } <= { 8'd0,8'd0 };
						{ isDone,sigma } <= { 1'b0,1'b0 };
				 end
		  else if( iCall )
		     case( i )
			  
			       0:
					 begin x <= 1 << 16; y = 32'd0; deg <= 32'd0; k <= 1'b0; gamma <= iData; i <= i + 1'b1; end
					 
					 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16:
					 begin
					      sigma = !k ? (y < 0)^(gamma < x) : sigma;
							gamma = !k ? gamma + ((gamma >>> i-1) >>> i-1) : gamma;
							
					      if( sigma )
							    begin
								     ty = y >>> i-1;
								     tx = x >>> i-1;
							        x <= x - ty;
								     y <= y + tx;
								     deg <= deg + atan[i-1];
							    end
					      else
							    begin
								     ty = y >>> i-1;
								     tx = x >>> i-1;
							        x <= x + ty ;
								     y <= y - tx ;
								     deg <= deg - atan[i-1];
							    end
							 
							 if( k == 0 ) begin k <= 1'b1; i <= i; end
							 else begin k <= 1'b0; i <= i + 1'b1; end
					 end
					
					17:
					begin isDone <= 1'b1; i <= i + 1'b1; end
					
					18:
					begin isDone <= 1'b0; i <= 8'd0; end
					   
			  endcase
			  
		assign oDone = isDone;
		assign arcsin = 5898240 - deg;
		assign arccos = deg;
		assign { q_deg,q_y,q_x } = { deg,y,x };
    
endmodule

这段代码实现了一个 CordicArcsinArccos 模块,用于计算反正弦(arcsin)和反余弦(arccos)的值。

模块的输入包括时钟信号 (CLOCK)、复位信号 (RESET)、iCall、iData。输出包括完成信号 (oDone)、arcsin、arccos、q_deg、q_y 和 q_x。

代码的主要部分是 always 块,它在时钟上升沿或复位信号下降沿时执行。根据不同的状态(通过变量 i 的值),代码执行不同的操作。下面是状态的解释:

- 当 i = 0 时,表示初始化阶段。x 被设置为 2^16,y 被设置为 0,deg 被设置为 0,k 被设置为 0,gamma 被设置为输入变量 iData 的值。
- 当 i 为 1 到 16 时,表示 Cordic 迭代的 16 个阶段。代码根据 sigma 的值(k 的取反)来选择正弦或余弦方向。根据 sigma 的值,更新 x、y 和 deg 的值,并在每个阶段更新 i 和 k 的值。
- 当 i = 17 时,表示计算完成。isDone 被设置为 1,i 被递增。
- 当 i = 18 时,表示计算重置。isDone 被设置为 0,i 被重置为 0。

最后,使用 assign 语句将输出变量与内部变量进行关联,计算 arcsin 和 arccos 的值,并将 deg、y 和 x 的值分配给 q_deg、q_y 和 q_x。

需要注意的是,代码中的 atan 数组是 Cordic 算法中的固定值,用于计算反正弦和反余弦的近似值。

`q_deg`, `q_y`, 和 `q_x` 是输出端口,表示模块计算完成后的结果。它们分别代表角度 (`q_deg`)、y 坐标 (`q_y`) 和 x 坐标 (`q_x`)。

- `q_deg` 表示计算得到的角度值,以32位有符号整数表示。
- `q_y` 表示计算得到的 y 坐标值,以32位有符号整数表示。
- `q_x` 表示计算得到的 x 坐标值,以32位有符号整数表示。

这些值可以通过这些输出端口在模块外部访问和使用,以获取计算得到的结果。

CLOCK 和 RESET 信号是模块中常见的输入信号,用于控制模块的行为和确保正确的操作。

- CLOCK 信号是时钟信号,它提供了一个稳定的时序基准,用于同步模块的操作。模块的行为通常与时钟信号的上升沿(或下降沿)相关联,以确保在稳定的时钟周期内进行计算和状态更新。

- RESET 信号是复位信号,用于将模块初始化为已知的状态。当 RESET 信号为低电平(或高电平,具体取决于电路设计)时,模块将被复位,并将内部的状态和寄存器重置为初始值。这确保了模块在启动或者在特定条件下重新开始运行时,处于一致的状态。

CLOCK 和 RESET 信号是在数字电路设计中常见的概念,它们用于确保电路的正确操作和同步。通过使用这些信号,可以控制模块的时序行为,并在需要时重置模块的状态。

`iCall` 是模块的一个输入信号,用于触发计算过程的开始。它可能是 "input Call" 的缩写。

在该代码中,当 `iCall` 信号为高电平时,模块会执行计算过程。通过检测 `iCall` 信号的状态变化,可以开始新的计算任务。一旦 `iCall` 信号变为高电平,模块将执行 Cordic 算法的计算过程,并根据输入数据 `iData` 进行计算。

通常情况下,`iCall` 信号由外部电路或其他模块控制,用于启动特定的操作或计算任务。例如,在一个系统中,可以使用 `iCall` 信号来触发一次反正弦和反余弦计算,并获取计算结果。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andeyeluguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值