查找数字平方根的VHDL代码?

查找数字平方根的VHDL代码?,vhdl,Vhdl,设计中是否有任何内置函数或库可用于查找数字的平方根?恢复平方根算法很容易在fpga上实现 FPGA供应商应该有可用的内核,它隐藏在Xilinx上的通用CORDIC内核中。如果您需要的话,它们还具有浮点的平方根核。恢复平方根算法很容易在fpga上实现 FPGA供应商应该有可用的内核,它隐藏在Xilinx上的通用CORDIC内核中。如果您需要的话,它们还具有浮点的平方根核。对于不可合成(仅限模拟/测试台)操作,real的平方根可以通过以下方法完成: y := math_real.sqrt(x) 对

设计中是否有任何内置函数或库可用于查找数字的平方根?

恢复平方根算法很容易在fpga上实现


FPGA供应商应该有可用的内核,它隐藏在Xilinx上的通用CORDIC内核中。如果您需要的话,它们还具有浮点的平方根核。

恢复平方根算法很容易在fpga上实现

FPGA供应商应该有可用的内核,它隐藏在Xilinx上的通用CORDIC内核中。如果您需要的话,它们还具有浮点的平方根核。

对于不可合成(仅限模拟/测试台)操作,
real
的平方根可以通过以下方法完成:

y := math_real.sqrt(x)
对于可合成操作,请参阅Jonathan Drolet的回答。

对于不可合成(仅限模拟/测试台)操作,
的平方根可通过以下方法完成:

y := math_real.sqrt(x)

有关可合成的操作,请参阅Jonathan Drolet的答案。

这一个对我很有用

library ieee; 
use ieee.std_logic_1164.all; 
use IEEE.STD_LOGIC_unsigned.ALL;

entity squart is port( 
clock      : in std_logic;  
data_in    : in std_logic_vector(7 downto 0); 
data_out   : out std_logic_vector(3 downto 0)); end squart;

architecture behaviour of squart is

signal part_done  : std_logic := '0';
signal part_count : integer := 3; 
signal result     : std_logic_vector(4 downto 0) := "00000"; 
signal partialq   : std_logic_vector(5 downto 0) := "000000";

begin   
    part_done_1: process(clock, data_in, part_done)  
    begin
        if(clock'event and clock='1')then
            if(part_done='0')then
                if(part_count>=0)then
                    partialq(1 downto 0)  <= data_in((part_count*2)+ 1 downto part_count*2);
                    part_done <= '1';    else
                    data_out <= result(3 downto 0);    
                end if;    
                part_count <= part_count - 1;
                elsif(part_done='1')then
                    if((result(3 downto 0) & "01") <= partialq)then
                        result   <= result(3 downto 0) & '1';
                        partialq(5 downto 2) <= partialq(3 downto 0) - (result(1 downto 0)&"01");    
                    else 
                        result   <= result(3 downto 0) & '0';
                        partialq(5 downto 2) <= partialq(3 downto 0);                     
                    end if;   
                    part_done  <= '0';
                end if;
            end if;  
        end process;   
    end behaviour;
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.STD_LOGIC_unsigned.ALL;
实体squart是端口(
时钟:标准逻辑;
数据输入:标准逻辑向量(7到0);
数据输出:输出标准逻辑向量(3到0);端壁;
squart的体系结构行为是
完成信号部分:标准逻辑:='0';
信号部分计数:整数:=3;
信号结果:标准逻辑向量(4到0):=“00000”;
信号部分Q:std_逻辑_向量(5到0):=“000000”;
开始
完成部分1:过程(时钟、数据输入、完成部分)
开始
如果(clock'event和clock='1'),则
如果(part_done='0'),则
如果(部件计数>=0),则

partialq(从1降到0)这一个对我有效

library ieee; 
use ieee.std_logic_1164.all; 
use IEEE.STD_LOGIC_unsigned.ALL;

entity squart is port( 
clock      : in std_logic;  
data_in    : in std_logic_vector(7 downto 0); 
data_out   : out std_logic_vector(3 downto 0)); end squart;

architecture behaviour of squart is

signal part_done  : std_logic := '0';
signal part_count : integer := 3; 
signal result     : std_logic_vector(4 downto 0) := "00000"; 
signal partialq   : std_logic_vector(5 downto 0) := "000000";

begin   
    part_done_1: process(clock, data_in, part_done)  
    begin
        if(clock'event and clock='1')then
            if(part_done='0')then
                if(part_count>=0)then
                    partialq(1 downto 0)  <= data_in((part_count*2)+ 1 downto part_count*2);
                    part_done <= '1';    else
                    data_out <= result(3 downto 0);    
                end if;    
                part_count <= part_count - 1;
                elsif(part_done='1')then
                    if((result(3 downto 0) & "01") <= partialq)then
                        result   <= result(3 downto 0) & '1';
                        partialq(5 downto 2) <= partialq(3 downto 0) - (result(1 downto 0)&"01");    
                    else 
                        result   <= result(3 downto 0) & '0';
                        partialq(5 downto 2) <= partialq(3 downto 0);                     
                    end if;   
                    part_done  <= '0';
                end if;
            end if;  
        end process;   
    end behaviour;
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.STD_LOGIC_unsigned.ALL;
实体squart是端口(
时钟:标准逻辑;
数据输入:标准逻辑向量(7到0);
数据输出:输出标准逻辑向量(3到0);端壁;
squart的体系结构行为是
完成信号部分:标准逻辑:='0';
信号部分计数:整数:=3;
信号结果:标准逻辑向量(4到0):=“00000”;
信号部分Q:std_逻辑_向量(5到0):=“000000”;
开始
完成部分1:过程(时钟、数据输入、完成部分)
开始
如果(clock'event和clock='1'),则
如果(part_done='0'),则
如果(部件计数>=0),则
partialq(1到0)检查此项:

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体SQRT是
通用(b:自然范围4至32:=16);
端口(值:标准逻辑向量(15到0);
结果:输出标准逻辑向量(7到0);
结束SQRT;
SQRT的体系结构表现为
开始
过程(值)
变量vop:无符号(b-1降到0);
变量vres:无符号(b-1降到0);
变量vone:无符号(b-1到0);
开始
vone:=to_无符号(2**(b-2),b);
vop:=无符号(值);
VRE:=(其他=>'0');
while(vone/=0)循环
如果(vop>=vres+vone),则
vop:=vop-(vres+vone);
vres:=vres/2+vone;
其他的
vres:=vres/2;
如果结束;
vone:=vone/4;
端环;
结果检查这个:

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体SQRT是
通用(b:自然范围4至32:=16);
端口(值:标准逻辑向量(15到0);
结果:输出标准逻辑向量(7到0);
结束SQRT;
SQRT的体系结构表现为
开始
过程(值)
变量vop:无符号(b-1降到0);
变量vres:无符号(b-1降到0);
变量vone:无符号(b-1到0);
开始
vone:=to_无符号(2**(b-2),b);
vop:=无符号(值);
VRE:=(其他=>'0');
while(vone/=0)循环
如果(vop>=vres+vone),则
vop:=vop-(vres+vone);
vres:=vres/2+vone;
其他的
vres:=vres/2;
如果结束;
vone:=vone/4;
端环;

结果您需要自己尝试,然后可能会产生疑问(无论您在哪里遇到困难)。
y:=math\u real.sqrt(x)
为您提供
real
类型的平方根。。。如果这不是你想要的,请展示你迄今为止所做的努力…@MortenZilmer这会有所帮助。我可以直接把这一行写进我的代码里吗?请看答案;但请注意,它不会像我在回答中所写的那样综合。你需要自己尝试,然后可能会提出你的疑问(无论你在哪里遇到困难)。
y:=math\u real.sqrt(x)
为你提供
real
类型的平方根。。。如果这不是你想要的,请展示你迄今为止所做的努力…@MortenZilmer这会有所帮助。我可以直接把这一行写进我的代码里吗?请看答案;但请注意,正如我在回答中所写,它不会合成。这个函数没有标准函数吗?在使用fpga超过30年后,您无法在一个时钟周期内以合理的延迟执行sqrt,因此有可能实现可合成的标准功能。作为VHDL语言的一部分,有一个作用于实数的函数。我会考虑IP核“标准函数”,而SqRT的IP核是容易获得的。对此没有标准函数吗?在使用fpga超过30年后,您无法在一个时钟周期内以合理的延迟执行sqrt,因此有可能实现可合成的标准功能。作为VHDL语言的一部分,有一个作用于实数的函数。我会考虑IP核“标准函数”,而SqRT的IP核是现成的。