Вычитание VHDL приводит к 'X' в верхнем 4-битном результате, как мне это исправить? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь реализовать алгоритм деления в VHDL. Для этого первым шагом является удвоение количества битов, которые находятся в делимом и делителе. Следующий шаг - выполнить вычитание с этими расширенными значениями. Когда vhdl выполняет вычитание, он заполняет верхние биты (те, которые были добавлены) символом «X», но результат младших битов верен.

Ниже мой код:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Divider is 
generic(
                n : positive := 4    -- bit number of adder
        );

port (
    dividend : in std_logic_vector(n-1 downto 0);
    divisor : in std_logic_vector(n-1 downto 0);
    quotient: out std_logic_vector(2*n-1 downto 0);
    remainder: out std_logic_vector(2*n-1 downto 0)
);
end Divider;

architecture archDivider of Divider is
begin
    process (divisor, dividend)
       variable intermediary_divisor: std_logic_vector(2*n-1 downto 0) := (others => '0');
      variable intermediary_remainder: std_logic_vector(2*n-1 downto 0) := (others => '0');
       variable intermediary_quotient: std_logic_vector(n-1 downto 0) := (others => '0');
        begin
        intermediary_divisor(2*n-1 downto n) := divisor;
        intermediary_remainder(n-1 downto 0) := dividend;
    --  for i in 0 to n-1 loop
            intermediary_remainder := std_logic_vector(to_unsigned(to_integer(unsigned(intermediary_remainder)) - to_integer(unsigned(intermediary_divisor)), 2*n));
    --      if (intermediary_remainder >= 0) then
    --          intermediary_quotient := to_stdlogicvector(to_bitvector(intermediary_quotient) sll 1);
    --          intermediary_quotient(0) := '1';
    --      else
    --          intermediary_remainder := intermediary_remainder + intermediary_divisor;
    --          intermediary_quotient := to_stdlogicvector(to_bitvector(intermediary_quotient) sll 1);
    --      end if;
                 intermediary_divisor := to_stdlogicvector(to_bitvector(intermediary_divisor) srl 1);
    --  end loop;

        quotient <= intermediary_divisor(2*n-1 downto 0);
        remainder <= intermediary_remainder(2*n-1 downto 0);
        end process;
 end archDivider;

В настоящее время большая часть алгоритма закомментирована, пока я пытаюсь отладить свой код, и некоторые выходные данные не установлены на то, что они должны быть для фактического алгоритма, но это для целей отладки. Что в моем коде может привести к такой странной проблеме?

...