是否有任何算法或代码可以在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;
答案 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;