VHDL,使用存储算法除法..代码不工作

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

我编写了一个简单的代码,使用恢复算法进行除法(分子、分母)。语法很好,但在模拟中,我只得到商中的“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;
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;