VHDL сумматор, той же длины слова?

В VHDL я хочу добавить число 5 битов и число 8 битов.(Без знака) И сколько битов имеет выход?

Я хочу, чтобы мой код отвечал на вопросы, которые я только что задал. Мой код в настоящее время выглядит так...

Мой код:

library ieee;
use ieee-std_logic_1164.all;
entity adder is
port( a : in unsigned (7 downto 0);
         b : in unsigned (4 downto 0); - - Need to convert this to 8 bit right? But how?
         z : out unsigned(7 downto 0)); - - This one must be  8 bits right? Cuz a & b & z must have the same WL. Or am i wrong?

end adder;

archictecture add of adder is 
begin 
z <= a + b;
end archictecture;

2 ответа

Решение

В пакете numeric_std для function "+" (L, R: UNSIGNED) return UNSIGNED длина самого длинного аргумента определяет длину возвращаемого значения:

  function "+" (L, R: UNSIGNED) return UNSIGNED is
    constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH);
    variable L01 : UNSIGNED(SIZE-1 downto 0);
    variable R01 : UNSIGNED(SIZE-1 downto 0);
  begin
    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;
    end if;
    L01 := TO_01(RESIZE(L, SIZE), 'X');
    if (L01(L01'LEFT)='X') then return L01;
    end if;
    R01 := TO_01(RESIZE(R, SIZE), 'X');
    if (R01(R01'LEFT)='X') then return R01;
    end if;
    return ADD_UNSIGNED(L01, R01, '0');
  end "+";

Максимальная длина левого и правого аргументов SIZEдиапазон двух аргументов изменяется до SIZE -1 downto 0 в качестве аргументов ADD_UNSIGNED,

  function ADD_UNSIGNED (L, R: UNSIGNED; C: STD_LOGIC) return UNSIGNED is
    constant L_LEFT: INTEGER := L'LENGTH-1;
    alias XL: UNSIGNED(L_LEFT downto 0) is L;
    alias XR: UNSIGNED(L_LEFT downto 0) is R;
    variable RESULT: UNSIGNED(L_LEFT downto 0);
    variable CBIT: STD_LOGIC := C;
  begin
    for I in 0 to L_LEFT loop
      RESULT(I) := CBIT xor XL(I) xor XR(I);
      CBIT := (CBIT and XL(I)) or (CBIT and XR(I)) or (XL(I) and XR(I));
    end loop;
    return RESULT;
  end ADD_UNSIGNED;

RESULTДлина аргумента L совпадает с аргументами UNSIGNED_ADD, Нет результата, подразумеваемого в результате.

Как и в вашем случае результат, присвоенный z может быть 8 бит.

Исправьте разделители комментариев в объявлениях портов, добавьте условие использования для доступа к пакету numeric_std, исправьте "-", которое должно быть ".", Написание architecture и добавить тестовый стенд, добавив значения для a а также b установите все "1", и вы сможете безошибочно анализировать, разрабатывать и запускать свой дизайн, сообщая, что не выполняется ошибка длины массива.

Чтобы получить этот девятый "бит" в качестве выходного сумматора, вы можете RESIZE один из ваших аргументов + до 9 бит или объединить один аргумент с ведущими нулями для получения 9-битного значения:

    z <= "0" & a + b;

Это покажет, что 9-й бит необходим для точного результата:

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

entity adder is
    port( 
        a: in  unsigned (7 downto 0);
        b: in  unsigned (4 downto 0); 
        z: out unsigned (8 downto 0)
    ); 
end adder;

architecture add of adder is 
begin 
    z <= "0" & a + b;
end architecture;

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

entity tb_adder is 
end entity;

architecture foo of tb_adder is
    signal a: unsigned (7 downto 0) := (others => '1');
    signal b: unsigned (4 downto 0) := (others => '1');
    signal z: unsigned (8 downto 0);

    function unsigned_image(inp: unsigned) return string is
        variable image_str: string (1 to inp'length);
        alias input_str:  unsigned (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
        end loop;
        return image_str;
    end;

begin

DUT: 
    entity work.adder
        port map (
            a => a,
            b => b,
            z => z
        );

MONITOR:
    process 
    begin
        wait for 1 ns;
        report "z = " & unsigned_image(z);
        wait;
    end process;

end architecture;

david_koontz @ Macbook: ghdl -a adder.vhdl
david_koontz @ Macbook: ghdl -e tb_adder
david_koontz @ Macbook: ghdl -r tb_adder
adder.vhdl: 54: 9: @ 1ns: (примечание к отчету): z = 100011110

Кроме этого исправления:

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

Ваш код в порядке.

Кроме того, добавление 8-битного числа и 5-битного числа дает 9-битное число, потому что вы можете переполниться. Например, "11111111" + "11111" переполняет 8-битный вывод, но не переполняет 9-битный вывод.

Другие вопросы по тегам