(转载)FPGA实现开发运算verilog

http://bbs.ednchina.com/BLOG_ARTICLE_3003247.HTM

专题五:开方运算

开方运算虽然不像加法、乘法那么常用,但是也有其用武之地。在去年的一个项目中,笔者负责的模块中就使用了开方运算,开始时使用的是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];

[email protected](posedge clk)

begin

         if(rst)

         begin

                   R_t[q_width]<={r_width{1‘b0}};

    D_t[q_width]<={d_width{1‘b0}};

    Q_t[q_width]<={q_width{1‘b0}};

    ivalid_t[q_width]<=1‘b0;

         end

         else

         begin

    if(ivalid)

    begin

      R_t[q_width]<={R[r_width-3:0],D[d_width-1:d_width-2]} - {{q_width-1{1‘b0}},2‘b01};

      D_t[q_width]<=D;

      Q_t[q_width]<={q_width{1‘b0}};

      ivalid_t[q_width]<=1‘b1;

    end

    else

    begin

      R_t[q_width]<={r_width{1‘b0}};

      D_t[q_width]<={d_width{1‘b0}};

      Q_t[q_width]<={q_width{1‘b0}};

      ivalid_t[q_width]<=1‘b0;

    end

         end

end

generate

genvar i;

for(i=q_width-1;i>=1;i=i-1)

begin:U

         [email protected](posedge clk)

         begin

                   if(rst)

                   begin

                            Q_t[i]<={q_width{1‘b0}};

                            R_t[i]<={r_width{1‘b0}};

             D_t[i]<={d_width{1‘b0}};

             ivalid_t[i]<=1‘b0;

                   end

                   else

                   begin

                            if(ivalid_t[i+1])

                            begin

                                     if(R_t[i+1]>=0)

                                     begin

                                               Q_t[i]<={Q_t[i+1][q_width-2:0],1‘b1};

                                               R_t[i]<={R_t[i+1][r_width-3:0],D_t[i+1][2*i-1:2*i-2]} - {1‘b0,Q_t[i+1][q_width-4:0],1‘b1,2‘b01};

                                D_t[i]<=D_t[i+1];

                                ivalid_t[i]<=1‘b1;

                              end

                              else

                              begin

                                   Q_t[i]<={Q_t[i+1][q_width-2:0],1‘b0};

                                               R_t[i]<={R_t[i+1][r_width-3:0],D_t[i+1][2*i-1:2*i-2]} + {1‘b0,Q_t[i+1][q_width-4:0],1‘b0,2‘b11};

                                D_t[i]<=D_t[i+1];

                                ivalid_t[i]<=1‘b1;

                              end

                     end

                     else

                     begin

                          Q_t[i]<={q_width{1‘b0}};

                                     R_t[i]<={r_width{1‘b0}};

                       D_t[i]<={d_width{1‘b0}};

                       ivalid_t[i]<=1‘b0;

                     end

                   end

         end

end

endgenerate

[email protected](posedge clk)

begin

         if(rst)

         begin

                   Q<={q_width{1‘b0}};

                   R<={r_width{1‘b0}};

                   ovalid<=1‘b0;

         end

         else

         begin

                   if(ivalid_t[1])

                   begin

                            if(R_t[1]>=0)   

                            begin

                                     Q<={Q_t[1][q_width-2:0],1‘b1};

                                     R<=R_t[1];

                            end

                            else

                            begin

                                     Q<={Q_t[1][q_width-2:0],1‘b0};

                                     R<=R_t[1] + {1‘b0,Q_t[1][q_width-3:0],1‘b0,1‘b1};

                            end

                            ovalid<=1‘b1;

                   end

                   else

                   begin

                            Q<={q_width{1‘b0}};

                            R<={r_width{1‘b0}};

                            ovalid<=1‘b0;

                   end

         end

end

endmodule

综合结果如下:

Number of Slice Registers:             677

Number of Slice LUTs:                 1105

Minimum period: 3.726ns (Maximum Frequency: 268.384MHz)

如图1所示为仿真图:

图1

时间: 2024-10-10 03:08:35

(转载)FPGA实现开发运算verilog的相关文章

FPGA quartus开发中常见的错误处理

1.Warning: An incorrect timescale is selected for the Verilog Output (.VO) file of this PLL design. It's required that the timescale should be 1 ps when simulating a PLL design in a third party EDA tool. 解决办法:是因为timessale不是1ps导致的错误,原因可能是之前使用过modelSim

转载FPGA学习之内嵌乘法器调用

补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别想着要自己写一个乘法器,那样子做的孩子是笨蛋. 不管老师说得对不对,总之,既然FPGA内部有硬件乘法器那么为啥不直接使用呢,而且在写verilog使用是非常简单的,只是用个*号就轻易搞定. 只要所使用的FPGA内嵌有乘法器,则综合软件在综合的时候就会自动帮你调用乘法器实现. 下面是一段简单代码: m

【转载】软件开发启示录——迟到的领悟

作者: John Sonmez  来源: IDF实验室博客  发布时间: 2013-10-20 15:47 转自(http://blog.idf.cn/2013/09/4-things-i-wish-i-would-have-known-when-i-started-my-software-development-career/) 我的软件开发生涯开始于15年前. 但是直到最近的5年,我才真正开始看到自己在软件开发领域的巨大进步. 这里有一些感悟是我希望能够在我进入软件开发领域时所知道的事情,如

最新设计打样制作完成的FPGA视频开发板VIP—V101

设计目的:1.摄像头驱动(30w-500w mipi接口)2.VGA显示器驱动3.USB2.0视频采集4.tft液晶接口(ttl.lvds驱动)5.视频.图像处理(算法验证)6.各种视频接口处理(av.vga.lvds) 完成效果:目前硬件已基本测试完成(串口.68013.vga.sdram.uart.cmos-ov7725,ov7670.7寸tft液晶驱动)1.完成例程测试:vga摄像头视频显示.vga显示sdram高速数据.pc视频采集2.移植crazybingo例程:灰度算法.二值化.中值

(转载)Android开发在路上:少去踩坑,多走捷径

1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行update,可以及时了解Android版本比例趋势. 屏幕密度数据 OpenGL ES版本 也可以参考一下国内一个第三方数据:http://www.umind

【转载】为什么开发人员工作10年还是很迷茫?

眼看自己大学毕业后都快12年了,也快2个孩子的爸爸了,但是有时候还是会有不少不安全的感觉产生.都快奔35了,技术也过得去,收入其实也很稳定,但是偶尔还是会有迷茫的时候,最近有几个朋友,也发QQ聊天信息,同样有类似的感觉.也稍微揣摩了一下,为啥会有这样的感觉产生? 其实软件开发也是一个行业,当厨师的也是一个行业,一个厨师干了10多年后,会不会变成国家主席?很可能还是厨师,甚至有有可能一辈子都是厨师,软件开发人员也是一个行业而已,也是为人民服务而已,估计厨师也会有迷茫的时候,我们也照样会有迷茫的时候

【转载】Web 开发中很实用的10个效果【附源码下载】

超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.美女很养眼吧 :) 源码下载      在线演示 网页边栏过渡动画 以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推

【转载】iOS开发使用半透明模糊效果方法整理

[转载自 http://www.cocoachina.com/ios/20141223/10731.html] 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开始大量使用半透明模糊. 在iOS开发当中,我们有很多选择可以做半透明模糊效果,下面就是一些常见的方式或者说工具. 0. Core Image 作为设计和体验方面的领导者,苹果自己对图片效果

转载 fpga中 restoring 和 non-restoring 除法实现。

对于non-restoring方法,主要是用rem和den移位数据比较,rem_d长度为den+nom的总长,den_d长度为den+nom的总长度,rem_d的初始值为{{d_width{1'b0}},nom};den_d的初始值为{1'b0,den,{(n_width-1){1'b0}}}.每次比较,移位同时进行. 除法运算也是数字信号处理中经常需要使用的.在FPGA设计中,通常为了简化算法,通常将除法近似为对数据进行移位操作即除数是2的整数次幂,因为在FPGA中进行移位很容易,比如右移2位