|
开方运算虽然不像加法、乘法那么常用,但是也有其用武之地。在去年的一个项目中,笔者负责的模块中就使用了开方运算,开始时使用的是Altera的IP Core,验证模块使用没有问题;但是因为平台转换,需要转换到Xilinx的平台,许多IP Core也需要转移,最后干脆自己写一个得了,包括前几个专题中的乘法器、除法器。
开方运算模块也使用与除法器类似的NonRestoring算法,包含输入D、输出开方结果Q和余数R;在FPGA中实现,则采用迭代方式一步步逼近结果,其中每一级的迭代式为:Ti+1=Ti(3 – Ti2)/2,Ti是1/Q的近似值。
Verilog HDL代码如下:
module sqrt
#( parameter d_width=32,
q_width=d_width/2,
r_width=q_width + 1)
(
input clk,
input rst,
input [d_width-1:0] D,
output reg [q_width-1:0] Q,
output reg [r_width-1:0] R,
input ivalid,
output reg ovalid
);
reg [d_width-1:0] D_t[q_width:1];
reg [q_width-1:0] Q_t[q_width:1];
reg signed [r_width-1:0] R_t[q_width:1];
reg ivalid_t[q_width:1];
always@(posedge clk)
begin
if(rst)
begin
R_t[q_width]=1;i=i-1)
begin:U
always@(posedge clk)
begin
if(rst)
begin
Q_t=0)
begin
<strong><em> Q_t |
|