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-битный вывод.