verilog实现开根号运算代码及仿真
0 2023-03-22


首先定义端口如下,输入位宽参数化,开根号的结果位宽是输入位宽的一半,余数多保留3位。代码在输入数据有效时进行计算,输出开根号的结果和余数。

module cm_sqrt #( parameter C_DATA_WITH_IN     = 32                 , parameter C_DATA_WITH_OUT    = C_DATA_WITH_IN/2   , parameter C_DATA_WITH_REM    = C_DATA_WITH_OUT+3  )( input wire                         I_sys_clk   , /// 系统时钟 input wire                         I_data_en   , /// 数据有效标志,与数据对齐 input wire [C_DATA_WITH_IN-1:0]    I_data_in   , /// 输入数据 output reg                          O_data_en   , /// 数据有效标志,与数据对齐 output reg  [C_DATA_WITH_OUT-1:0]   O_data_out  , /// 开根号的结果 output reg  [C_DATA_WITH_REM-1:0]   O_data_rem  ); /// 余数

根据开根号原理,首先对最高两位进行判断:

如果是1,取高四位减b100,得到余数为差值,同时开根号的结果赋值为1;

如果是0,直接取高四位得到余数,开根号结果为0;













always @(posedge I_sys_clk) if(I_data_en) if(|I_data_in[C_DATA_WITH_IN-1:C_DATA_WITH_IN-2])       /// 高位是1,取高四位减b100,得到余数 begin S_data_out <= {{(C_DATA_WITH_OUT-1){1'b0}},1'b1}; S_data_rem <= {{(C_DATA_WITH_REM-5){1'b0}},I_data_in[C_DATA_WITH_IN-1:C_DATA_WITH_IN-4]}-3'b100; end else /// 高位是0,直接取高四位得到余数 begin S_data_out <= {{(C_DATA_WITH_OUT-1){1'b0}},1'b0}; S_data_rem <= {{(C_DATA_WITH_REM-5){1'b0}},I_data_in[C_DATA_WITH_IN-1:C_DATA_WITH_IN-4]}; end

然后算下一步的余数是否大于(2a+1),其中a是当前开根号的结果*2,


assign S_data_rem_cut = S_data_rem -  {1'b0,S_data_out[C_DATA_WITH_OUT-1:0],2'b0} - 1'b1;

如果大于,则开根号的结果为1,新的余数为{差值,输入的下两位},否则开根号的结果为0,新的余数为{当前余数,输入的下两位}。











 if(S_data_rem_cut[C_DATA_WITH_REM-1])                   /// 判断是否大于 2*a+1 begin S_data_out <= {S_data_out[C_DATA_WITH_OUT-2:0],1'b0}; S_data_rem <= {S_data_rem[C_DATA_WITH_REM-3:0],S_data_in[C_DATA_WITH_IN-5:C_DATA_WITH_IN-6]}; end else begin S_data_out <= {S_data_out[C_DATA_WITH_OUT-2:0],1'b1}; S_data_rem <= {S_data_rem_cut[C_DATA_WITH_REM-3:0],S_data_in[C_DATA_WITH_IN-5:C_DATA_WITH_IN-6]}; end

循环上述操作即可得到最终开根号的结果。

以上文中的例子详细说明图如下:

1、首先判断高两bit大于1,直接将高4bit减去3‘b100,得到余数为b11;

2、然后判断b11是否大于2a+1(此时a为b10),即b11是否大于101,判断结果为小于101;

3、新的余数变为b1101,开根号的结果为10,判断b1101是否大于2a+1(此时a为b100),即b1101是否大于1001,判断结果大于1001,差值为b100;

4、新的余数变为b10010,开根号的结果为101,判断b10010是否大于2a+1(此时a为b1010),即b10010是否大于b10101,判断结果小于。

5、循环结束,开根号的结果为b1010,余数为b10010。

使用随机数仿真如下,输入为随机数,仿真证明代码功能正常:

详细的视频教程见B站视频:【FPGA设计之verilog实现开根号】 https://www.bilibili.com/video/BV1we4y1U7zW/?share_source=copy_web&vd_source=9736f43bc2eebc284f4fbbe5805247a7


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【6.29直播】西门子EDA工具在3D IC设计中的应用


  • 相关技术文库
  • FPGA
  • 可编程
  • PLC
  • verilog
  • 时钟发生器的相位噪声和抖动性能

    系统设计师通常侧重于为应用选择最合适的数据转换器,在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而,如果不慎重考虑时钟发生器的相位噪声和抖动性能,

    06-02
  • 雷达信号处理上是选FPGA还是GPU,它们各自的特点又是什么?

      FPGA和CPU一直是雷达信号处理不可分割的组成部分。传统上FPGA用于前端处理,CPU用于后端处理。随着雷达系统的处理能力越来越强,越来越复杂,对信息处理

    05-29
  • PLC的相关知识分析

    写点纯理论的东西,最近一直在思考怎么跟零基础的人讲PLC。也就是当你面对一个门外汉时,怎么让他对PLC感兴趣,然后慢慢的带着学习PLC。思考了很多,又把学校的里

    05-27
  • 一文分析DDR线长匹配与时序

    DDR布线在PCB设计中占有举足轻重的地位,设计成功的关键就是要保证系统有充足的时序裕量。要保证系统的时序,线长匹配又是一个重要的环节。我们来回顾一下,DDR布

    05-27
  • 带你区分时序图、活动图、状态图、协作图

      时序图  时序图用于描述对象之间的传递消息的时间顺序,即用例中的行为顺序。  当执行一个用例时,时序图中的每条消息对应了一个类操作或者引起转换的触发事件。 

    05-26
  • 区分FPGA与DSP特点及用途

      FPGA是一种可编程的硅芯片,DSP是数字信号处理,当系统设计人员在项目的架构设计阶段就面临到底采用FPGA还是DSP的重要问题。本文将首先分别介绍FPGA

    05-26
  • FPGA概念对比CPU架构有啥特点

      你还没听过FPGA?那你一定是好久没有更新自己在企业级IT领域的知识了。今天笔者就和大家聊聊何为FPGA?FPGA主要应用场景是什么?有人说FPGA是替代传

    05-26
  • 时序收敛十大准则

    本文摘自《Vivado使用误区与进阶》,作者为Xilinx工具与方法学应用专家Ally Zhou。 时序收

    05-26
  • 仿真软件ModelSim及其应用

    如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶;如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方。

    05-25
  • 快速认识FPGA

      学习FPGA,在不同层次的人明显有不同的答案。先说一句,说不要开发版的都是菜鸟级选手。  我把FPGA层次划分为,鸡蛋级别,菜鸟级别,老鸟级别,高手级别四类

    05-25
  • 分析FPGA与CPLD的差别在哪

      1.CPLD  CPLD主要是由可编程逻辑宏单元(LMC,LogicMacroCell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复

    05-25
  • FPGA与CPLD的作用及不同之处

      FPGA/CPLD能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用FPGA/CPLD来实现。  FPGA/CPLD如同一张白纸或是一

    05-24
下载排行榜
更多
广告