如何在VHDL中找到平方根号?

时间:2016-11-24 06:10:44

标签: vhdl

是否有任何算法或代码可以在VHDL中找到整数的平方根?代码不得包含这些库:

IEEE.std_logic_arith.all;
IEEE.std_logic_unsigned.all;
IEEE.math_real.all;
IEEE.std_logic_signed.all;
IEEE.std_logic_unsigned.all;

4 个答案:

答案 0 :(得分:0)

看来你正在寻找可综合的代码,在这种情况下,问题应该提到。

一些数学运算通常由综合工具支持,如整数加法(a + b),整数否定(- a),整数减法(a - b),整数乘法({{ 1}}),而其他数学运算则不像点平方根运算。

因此,必须单独实现可合成的平方根操作,如user1155120所建议,并且实现将取决于对参数,准确性,吞吐量,延迟,大小等的要求。

但是出于模拟目的而不是可合成的,您可以使用*,下面的示例打印ieee.math_real.sqrt的平方根值:

2.0

答案 1 :(得分:0)

VHDL samples
 ...
32位并行整数平方根

VHDL源代码为sqrt32.vhdl
VHDL仿真的输出为sqrt32.out
从未绘制过原理图。 sqrt8m.vhdl扩大了 使用“generate”语句创建sqrt32.vhdl

仅包含对包ieee.std_logic_1164的引用,接受std_logic_vector长度为32并返回长度为16。

使用搜索字词 平方根VHDL ,您可以使用Google搜索功能。

<强>附录

我很好奇,qsort32.vhdl的测试平台很小。代码中有错误,它不起作用。纠正它的明显方法是重新实施它。它可能会在扩展sqrt8m.vhdl作为源(也可能被验证)时出现错误的假设。

还有其他平方根VHDL模型可用。顺序(连续减法除法器)模型在VHDL算术书籍中并不罕见,具有各种除法实现(例如非恢复)。

答案 2 :(得分:0)

如果字面上的措辞是代码不能包含IEEE.math_real.all;,那么您可以通过从math_real中仅选择所需内容来规避问题。

然后IEEE.math_real.sqrt;会做你想做的事。

然而,虽然这符合上述问题的字母,但我不能保证它满足意图。

更好的答案是采用任何算法来计算平方根 - 有很多,很容易在通常的来源中找到。在VHDL中实现它,并测试它。

答案 3 :(得分:0)

请尝试基于Crenshaw先生的算法的解决方案:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity SQRT is
    Generic ( b  : natural range 4 to 32 := 16 ); 
    Port ( value  : in   STD_LOGIC_VECTOR (15 downto 0);
           result : out  STD_LOGIC_VECTOR (7 downto 0));
end SQRT;

architecture Behave of SQRT is
begin
   process (value)
   variable vop  : unsigned(b-1 downto 0);  
   variable vres : unsigned(b-1 downto 0);  
   variable vone : unsigned(b-1 downto 0);  
   begin
      vone := to_unsigned(2**(b-2),b);
      vop  := unsigned(value);
      vres := (others=>'0'); 
      while (vone /= 0) loop
         if (vop >= vres+vone) then
            vop   := vop - (vres+vone);
            vres  := vres/2 + vone;
         else
            vres  := vres/2;
         end if;
         vone := vone/4;
      end loop;
      result <= std_logic_vector(vres(result'range));
   end process;
end;