我写了一个简单的代码,它使用恢复算法划分(Numerator,Denominator)。语法很好,但在模拟中我只得到" 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 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;
答案 0 :(得分:1)
您不应使用包ieee.std_logic_unsigned
。而是使用包ieee.numeric_std
。此包将数据类型unsigned
和signed
定义为std_logic_vector
的子类型。这些类型告诉编译器如何将位序列解释为数字。此程序包还允许在一个模块中混合使用无符号和带符号的数字,这是ieee.std_logic_unsigned
无法实现的。
其中,该软件包定义了适当的运算符,以便将unsigned
/ signed
与整数进行比较。
要与std_logic_vector
进行转换,例如,如果您的输入和输出属于此类型,只需使用以下类型转换(此处显示为函数,但实际上它们不是):
function std_logic_vector(x : unsigned) return std_logic_vector;
function std_logic_vector(x : signed) return std_logic_vector;
function signed (x : std_logic_vector) return signed;
function unsigned (x : std_logic_vector) return unsigned;
您也可以转换为整数:
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;
包ieee.numeric_std
中有很多更好的东西,比如带整数的算术运算符,符号扩展等等。
答案 1 :(得分:0)
在你的代码中,你有这个:
if (p < 0) then
P := P + Denominator;
Num(0) := '0';
else
Num(0) := '1';
end if;
您将p定义为standard logic vector
,并将其与0比较integer
。在这一刻我无法验证它,但您正在比较不同的类型,这是false
,然后每次'1'时选择插入else
。
尝试与"00000000"
进行比较以检查是否有变化(我想是的,因为在这种情况下类型相同)。