Линия имитации формы волны VHDL / Аномалия спайков - PullRequest
0 голосов
/ 04 октября 2019

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

enter image description here

код:

однобитный полный сумматор

library ieee;
use ieee.std_logic_1164.all;

entity one_bit_full_adder is
  port (
    x, y, cin : in std_logic;
    sum, cout: out std_logic);
end one_bit_full_adder;

architecture arch of one_bit_full_adder is
  begin
    sum <= x xor y xor cin;
    cout <= (x and y) or (cin and (x xor y));
  end arch;

N-разрядный вычитатель

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

entity n_bit_subtractor is
  generic(constant BIT_LENGTH : integer);
  port (
    a, b : in std_logic_vector(BIT_LENGTH - 1 downto 0);
    negative: out std_logic;
    difference: out std_logic_vector(BIT_LENGTH - 1 downto 0));
end n_bit_subtractor;

architecture arch of n_bit_subtractor is
  component one_bit_full_adder port (x, y, cin: in std_logic; sum, cout: out std_logic); end component;
  signal carry_ins: std_logic_vector(BIT_LENGTH downto 0) := (0 => '1', others => '0');
  signal differences: std_logic_vector(BIT_LENGTH - 1 downto 0);
  signal b_operand: std_logic_vector(BIT_LENGTH - 1 downto 0);

  begin
    b_operand <= not b;
    difference <= differences;
    negative <= differences(BIT_LENGTH - 1) and '1';
    adders: for i in 0 to BIT_LENGTH-1 generate
      H2: one_bit_full_adder port map(x=>a(i), y=>b_operand(i), cin=>carry_ins(i), sum=>differences(i), cout=>carry_ins(i+1));
    end generate;
  end arch;

Testbench:

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

entity n_bit_subtractor_test is
end n_bit_subtractor_test;

architecture arch_test of n_bit_subtractor_test is
constant BIT_LEN : integer := 3;
component n_bit_subtractor is
  generic(constant BIT_LENGTH : integer);
  port (
    a, b : in std_logic_vector(BIT_LENGTH - 1 downto 0);
    negative: out std_logic;
    difference: out std_logic_vector(BIT_LENGTH - 1 downto 0));
end component n_bit_subtractor;
signal p0, p1, difference: std_logic_vector(BIT_LEN-1 downto 0) := (others => '0');
signal negative: std_logic;
begin
  uut: n_bit_subtractor
    generic map (BIT_LENGTH => BIT_LEN)
    port map (a => p0, b => p1, difference => difference, negative => negative);

  process
  variable difference_actual: std_logic_vector(BIT_LEN-1 downto 0) := (others => '0');
  begin
    for i in 0 to (2**BIT_LEN)-1 loop
      for k in 0 to (2**BIT_LEN)-1 loop
        wait for 200 ns;
        p1 <= std_logic_vector(unsigned(p1) + 1);
      end loop;
      p0 <= std_logic_vector(unsigned(p0) + 1);
    end loop;

    report "No errors detected. Simulation successful." severity failure;
  end process;

end arch_test;

Любая помощь будет принята с благодарностью. Версия ModelSim v10.1d

...