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