VHDL,使用存储算法的分区......代码不起作用

时间:2015-11-13 21:29:56

标签: vhdl division

我写了一个简单的代码,它使用恢复算法划分(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;

2 个答案:

答案 0 :(得分:1)

您不应使用包ieee.std_logic_unsigned。而是使用包ieee.numeric_std。此包将数据类型unsignedsigned定义为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"进行比较以检查是否有变化(我想是的,因为在这种情况下类型相同)。