Примеры моделирования дискретных схем на VHDL
В качестве примера приведем проекты на VHDL, реализующие при помощи различных форм VHDL-описаний простейший одноразрядный сумматор с учетом переноса (см. рисунок), а также сумматор с произвольной разрядностью.

Двоичный одноразрядный сумматор с переносом
Определим необходимые элементы для реализации одноразрядного сумматора с переносом — это элементы and, or и xor. Реализуем данные элементы в виде библиотеки gates:
library IEEE;
use IEEE.std_logic_1164.all;package gates is
component and_2
generic (tpd_h1 : time := 1 ns;
tpd_lh : time :=1 ns);
port (in1, in2 : std_ulogic;
out1 : out std_ulogic);
end component;component or_2
generic (tpd_h1 : time := 1 ns;
tpd_lh : time := 1 ns);
port (in1, in2 : std_logic;
out1 : out std_logic);
end component;component xor_2
generic (tpd_hl : time := 1 ns;
tpd_lh : time := 1 ns);
port (in1, in2 : std_logic;
out1 : out std_logic);
end component;
end gates;library IEEE;
use IEEE.Std_Logic_1164.all;
————————–
– Элемент "И"
————————–
entity and_2 is
generic (tpd_hl : time := 1 ns;
tpd_lh : time := 1 ns);
port (in1, in2 : std_ulogic;
out1 : out std_ulogic);
end and_2;architecture only of and_2 is
begin
p1: process (in1, in2)
variable val : std_ulogic;
begin
val := in1 and in2;
case val is
when ’0′ => out1 <= '0' after tpd_hl;
when '1' => out1 <= '1' after tpd_lh;
end case;
end process;
end only;
-------------------------
-- Элемент "ИЛИ"
--------------------------
library IEEE;
use IEEE.Std_Logic_1163.all;entity or_2 is
generic (tpd_hl : time := 1ns;
tpd_lh : time := 1ns);
port (in1, in2 : std_logic);
out1 : out std_logic);
end or_2;architecture only of or_2 is
begin
p1: process (in1, in2)
variable val : std_logic;
begin
val := in1 or in2;
case val is
when '0' => out1 <= '0' after tpd_hl;
when '1' => out1 <= '1' after tpd_lh;
when others => out1 <= val;
end case;
end process;
end only;
--------------------------
-- Элемент "Исключающее ИЛИ"
--------------------------
library IEEE;
use IEEE.Std_Logic_1164.all;entity xor_2 is
generic (tpd_hl : time := 1ns;
tpd_lh : time := 1ns);
port (in1, in2 : std_logic);
out1 : out std_logic);
end xor_2;architecture only of xor_2 is
begin
p1: process (in1, in2)
variable val : std_logic;
begin
val := in1 xor in2;
case val is
when '0' => out1 <= '0' after tpd_hl;
when '1' => out1 <= '1' after tpd_lh;
when others => out1 <= val;
end case;
end process;
end only;
Реализуем простейший сумматор с учетом переноса на поведенческом и структурном уровнях, используя логические элементы из библиотеки
gates:
library IEEE;
use IEEE.Std_Logic_1164.all;entity simple_adder is
port (a : in std_logic;
b : in std_logic;
cin : in std_logic;
sum : out std_logic;
cout : out std_logic);
end simple_adder;– Описание простейшего сумматора при помощи
– параллельного присваивания (потоковая форма)architecture rtl of simple_adder is
begin
sum <= (a xor b) xor cin;
cout <= (a and b) or (cin and a) or (cin and b);
end rtl;-- Описание простейшего сумматора на
-- структурном уровне-- Используем описания из библиоткеи gates
use work.gates.all;architectrue structural of simple_adder is
signal xor1_out,
and1_out,
and2_out,
or1_out : std_logic;begin
xor1: xor_2 port map (in1 => a, in2 => b, out1 => xor1_out);
xor2: xor_2 port map (in1 => xor1_out, in2 => cin, out1 => sum);
and1: and_2 port map (in1 => a, in2 => b, out1 => and1_out);
or1: or_2 port map (in1 => a, in2 => b, out1 => or1_out);
and2: and_2 port map (in1 => cin, in2 => or1_out, out1 => and2_out);
or2: or_2 port map (in1 => and1_out, in2 => and2_out, out1 => cout);
end structural;
В качестве примера использования настройки приведем реализацию сумматора с последовательным переносом с произвольной (определяемой пользователем) разрядностью, в котором в структурном описании используется разработанный ранее простейший сумматор:
————————–
– N-битный сумматор
– Размерность сумматора определяется
– параметром настройки N
————————–library IEEE;
use IEEE.Std_Logic_1164.all;entity adderN is
generic(N: integer := 16);
port (a : in std_logic_vector (N downto 1);
b : in std_logic_vector (N downto 1);
cin : in std_logic;
sum: out std_logic_vector (N downto 1);
cout : out std_logic);
end adderN;– Реализация сумматора на структурном уровне
architecture structural of adderN is
component simple_adder
port (a : in std_logic;
b : in std_logic;
cin : in std_logic;
sum : out std_logic;
cout : out std_logic);
end component;
signal carry : std_logic_vector (0 to N);
begin
carry (0) <= cin;
cout <= carry (N);
-- Конкретизируем простейший сумматор N раз
gen: for I in 1 to N generate
add: simple_adder port map (
a => a (I),
b => b (I),
cin => carry (I-1),
sum => sum (I),
cout => carry (I));
end generate;
end structural;– Реализация сумматора на поведенческом уровне
architecture begavioral of adderN is
begin
p1: process (a, b, cin)
variable vsum: std_logic_vector (N downto 1);
variable carry: std_logic;
begin
carry := cin;
for i in 1 to N loop
vsum (i) := (a(i) xor b(i)) xor carry;
carry := (a(i) and b(i)) or (carry and (a(i) or b(i)));
end loop;
sum <= vsum;
cout <= carry;
end process p1;
end behavioral;
- Разработка модели двоичного одноразрядного сумматора с переносом – Active-HDL
- Проект и структура описания объектов в VHDL
- Задачи, решаемые применением языка VHDL для анализа и синтеза дискретных систем
- Моделирование цифрового автомата управления лифтом – Active-HDL
- Принципы моделирования на языке VHDL
- Применение пакета прикладных программ Aldec Active-HDL 5.1 для моделирования на VHDL
- Скалярные типы данных в VHDL
- Функции и процедуры, пакеты в VHDL
- Введение в VHDL
- Составные (композитные) типы: массивы и записи в VHDL
- Процесс моделирования и краткий обзор видов моделирования
- Графический редактор схем в Aldec Active-HDL
- Имитационное моделирование комбинированных (непрерывно-дискретных) систем
- Общие принципы расчета надежности структурных схем электростанций
- Особенности построения моделей дискретных процессов на языке GPSS
- Операции в VHDL
- Понятие события в Delphi – синтаксис, примеры