VHDL,使用存储算法除法..代码不工作
我编写了一个简单的代码,使用恢复算法进行除法(分子、分母)。语法很好,但在模拟中,我只得到商中的“11111111”VHDL,使用存储算法除法..代码不工作,vhdl,division,Vhdl,Division,我编写了一个简单的代码,使用恢复算法进行除法(分子、分母)。语法很好,但在模拟中,我只得到商中的“11111111” library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DIV_8bit is Port ( Numerator : in STD_LOGIC_vector(7 downto 0); Denominator : in
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DIV_8bit is
Port (
Numerator : in STD_LOGIC_vector(7 downto 0);
Denominator : in STD_LOGIC_vector(7 downto 0);
Quotient : out STD_LOGIC_vector(7 downto 0);
Remainder : out STD_LOGIC_vector(7 downto 0)
);
end DIV_8bit;
architecture Behavioral of DIV_8bit is
begin
process(Numerator , Denominator)
variable Num: std_logic_vector(7 downto 0) := Numerator;
variable p :std_logic_vector (7 downto 0) := (others=>'0');
variable Den: std_logic_vector (7 downto 0) := Denominator;
variable i : integer :=0;
begin
Division_loop: for i in 0 to 7 loop
p(7 downto 1) := p(6 downto 0);
p(0) := Num(7);
Num(7 downto 1) := Num(6 downto 0) ;
p := p - Den;
if (p < 0) then
P := P + Denominator;
Num(0) := '0';
else
Num(0) := '1';
end if ;
end loop;
Quotient <= Num;
Remainder <= p;
end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体部门8它是
港口(
分子:标准逻辑向量(7到0);
分母:标准逻辑向量(7到0);
商:输出标准逻辑向量(7到0);
余数:输出标准逻辑向量(7到0)
);
结束divu8bit;
DIV_8bit的体系结构是
开始
过程(分子、分母)
变量Num:std_逻辑_向量(7到0):=分子;
变量p:std_逻辑_向量(7到0):=(其他=>'0');
变量Den:std_逻辑_向量(7到0):=分母;
变量i:整数:=0;
开始
除法_循环:对于0到7循环中的i
p(7降到1):=p(6降到0);
p(0):=Num(7);
Num(7向下到1):=Num(6向下到0);
p:=p-Den;
如果(p<0),则
P:=P+分母;
Num(0):=“0”;
其他的
数值(0):=“1”;
如果结束;
端环;
商您不应该使用包ieee.std\u logic\u unsigned
。而是使用ieee.numeric\u std软件包。此包将数据类型无符号
和有符号
定义为标准逻辑向量
的子类型。这些类型告诉编译器如何将位序列解释为数字。该软件包还允许在一个模块中混合使用无符号和有符号数字,这是ieee.std_logic_unsigned
无法实现的
其中,该包定义了适当的运算符,用于将无符号
/有符号
与整数进行比较
要在std_logic_vector
之间进行转换,例如,如果您的输入和输出属于此类型,只需使用以下类型转换(此处显示为函数,但实际上不是):
您还可以从和转换为整数:
function to_integer (x : unsigned) return integer;
function to_integer (x : signed) return integer;
function to_unsigned(x: integer; size : natural) return unsigned;
function to_signed (x: integer; size : natural) return signed;
软件包中有很多更好的东西,比如带整数的算术运算符、符号扩展等等。前三个“函数”不是。类型转换是一种基本操作,显式类型转换的形式为类型\标记(操作数)
,并且仅在密切相关的类型之间工作(std\ U逻辑\向量、有符号和无符号密切相关,请参见IEEE std 1076-2008,9.3.6类型转换)to_unsigned
和to_signed
在package numeric\u std中有两个参数,第二个参数size
with是自然参数,没有默认值。@user1155120您是对的,我错过了size
参数。我在这里使用函数语法进行类型转换,因为它比IEEE标准中的解释更容易理解。添加了一条关于此的注释。
function to_integer (x : unsigned) return integer;
function to_integer (x : signed) return integer;
function to_unsigned(x: integer; size : natural) return unsigned;
function to_signed (x: integer; size : natural) return signed;