Modelsim.Длина массивов не совпадает - PullRequest
0 голосов
/ 16 октября 2018

Я написал программу для modelsim, которая добавляет к числам и помещает результат в Ra / Sum.Я использовал буфер с тремя состояниями, но получаю следующее: Fatal: (vsim-3420) Длина массива не совпадает.Слева 16 (15 до 0).Справа 8 (7 до 0).Я понимаю, что это потому, что они имеют разную длину.Но они также не могут иметь одинаковую длину, потому что тогда я получаю ошибку при добавлении add1 и add2 и размещении их в Sum.Так что я могу сделать, чтобы заставить эту работу?

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.numeric_std.all;

entity MAC is
generic (width: integer := 8);
port(
    clk, reset      :    in STD_LOGIC; 
    MLS_select      :    in STD_LOGIC;
    Rn, Rm, Ra :    in STD_LOGIC_VECTOR(width-1 downto 0);
    Rd         :    out STD_LOGIC_VECTOR(width-1 downto 0)
);
end;

architecture behavioral of MAC is
signal mul1, mul2, add1 : UNSIGNED(width-1 downto 0);
signal add2, sum        : UNSIGNED(width*2-1 downto 0);
begin
    process(clk, reset)

    begin
        if reset = '1' then Rd <= (others => '0');

        elsif rising_edge(clk) then
            Rd <= STD_LOGIC_VECTOR(sum(width-1 downto 0)); 
      end if;

    end process;

     mul1 <= UNSIGNED(Rn);
     mul2 <= UNSIGNED(Rm);
     add1 <= UNSIGNED(Ra);
     add2 <= mul1*mul2;
     sum <= add2 when clk = '1' else add2; 
     sum <= add1+add2;
  end architecture;

1 Ответ

0 голосов
/ 22 октября 2018

Сначала ... when clk = '1' else ... создаст защелку, но без триггера.
Вам необходимо использовать ... when rising_edge(clk);.

library IEEE;
use     IEEE.std_logic_1164.all;
use     IEEE.numeric_std.all;

entity MAC is
  generic (width: integer := 8);
  port(
    clk, reset  : in  STD_LOGIC; 
    MLS_select  : in  std_logic;
    Rn, Rm, Ra  : in  std_logic_vector(width - 1 downto 0);
    Rd          : out std_logic_vector(width - 1 downto 0) := (others => '0')
  );
end entity;

architecture rtl of MAC is
  signal mul1, mul2, add1 : unsigned(width - 1 downto 0);
  signal add2, sum        : unsigned(width * 2 - 1 downto 0);

begin
  process(clk, reset)
  begin
    if (reset = '1') then
      Rd <= (others => '0');
    elsif rising_edge(clk) then
      Rd <= std_logic_vector(sum(Rd'range)); 
    end if;
  end process;

  mul1 <= unsigned(Rn);
  mul2 <= unsigned(Rm);
  add1 <= unsigned(Ra);
  add2 <= (mul1 * mul2) when rising_edge(clk);

  sum <= resize(add1, add'length) + add2;
end architecture;

Сигнал MLS_select не используется.Нет необходимости вычислять сумму с таким количеством битов.Я предлагаю усечь add2 перед сложением, чтобы уменьшить количество неиспользуемых битов (и генерируемых ими предупреждений).

...