Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Бабак VHDL

.pdf
Скачиваний:
9
Добавлен:
05.06.2026
Размер:
2 Мб
Скачать
☆
140
Глава 11. Примеры VHDL"проектов ЦУ различного назначения
data: in std_logic_vector (7 downto 0); count: out std_logic_vector (7 downto 0));
end counter; architecture behave of counter is signal count_i : std_logic_vector (7 downto 0); begin process (clk, reset) begin if (reset = '0') then count_i <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then
count_i <= data;
else
count_i <= count_i + '1';
end if; end if; end process;
count <= count_i; end behave;
11.1.28. 8битный накапливающий/вычитающий счетчик с выбором направления счета
   Проект Counters  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
entity counters is port( d : in integer range 0 to 255;
clk : in bit; clear : in bit; load : in bit; up_down : in bit; qd : out integer range 0 to 255);
end counters; architecture a of counters is begin process (clk) variable cnt : integer range 0 to 255;
11.1. Проекты ЦУ общего назначения
variable direction : integer; begin if (up_down = '1') then  Выбор направления.
direction := 1;
else
direction := 1;
end if; if (clk'EVENT and clk = '1') then
if (load = '1') then cnt := d; end if; if (clk'EVENT and clk = '1') then if (up_down = '1') then cnt := cnt + direction; else cnt := cnt + direction; end if;  Организация синхронного сброса счетчика. if (clear = '0') then cnt := 0; end if; end if;
end if;
qd <= cnt;
end process; end a;
141
11.1.29. Nбитный накапливающий счетчик со счетным входом, синхронной загрузкой и асинхронным сбросом
Счетчик сбрасывается в 0 сигналом rst, равным 1, не ожидая при хода очередного тактового сигнала clk. Счетчик подсчитывает коли чество поступивших на него тактовых импульсов clk, когда на его счетном входе en присутствует сигнал 1. При приходе очередного пе реднего тактового импульса clk счетчик устанавливается в состояние data (записывает значение data), когда на его входе load присутс твует сигнал 1. Разрядность счетчика (width) указывается в операторе generic().
142
Глава 11. Примеры VHDL"проектов ЦУ различного назначения
   Проект Counter  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity counter is generic (width : integer := 16); port (data : in std_logic_vector (width1 downto 0);
load, en, clk, rst : in std_logic; q : out std_logic_vector (width1 downto 0));
end counter; architecture behave of counter is signal count : std_logic_vector (width1 downto 0); begin process(clk, rst) begin if rst = '1' then count <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then
count <= data; elsif en = '1' then count <= count + 1;
end if; end if; end process;
q <= count; end behave;
11.1.30. Синхронный 4битный циклический сдвиговый регистр вправо с параллельным входом и выходом
Этот регистр выполняет операцию циклического сдвига вправо только при наличии (обнаружении) очередного переднего фронта так тового сигнала clk и значения разрешающего сигнала ce, равного 1.
11.1. Проекты ЦУ общего назначения
143
Обнаружение очередного переднего фронта тактового сигнала clk осуществляется в проекте с помощью специальной подпрограммы функции rising_edge(clk) (объявление этой функции содержится в ядре языка VHDL). Очистка регистра сигналом clr, предустановка сигналом set и загрузка данными data сигналом load также возмож на при наличии (обнаружении) очередного переднего фронта тактово го сигнала clk и значения разрешающего сигнала ce, равного 1. Сиг налы clr, set и load должны быть единичными при выборе соот ветствующей операции.
   Проект Shft_Reg_ROR  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all; entity shft_reg_ror is
port ( CLK : in std_logic; CLR : in std_logic; SET : in std_logic; CE : in std_logic; LOAD : in std_logic; DATA : in std_logic_vector(3 downto 0); O : out std_logic_vector(3 downto 0));
end entity; architecture shft_reg_arch of shft_reg_ror is signal TEMP_O : std_logic_vector(3 downto 0); signal SI : in std_logic; begin
process(CLK) begin if rising_edge(CLK) then if CE = '1' then if CLR = '1' then TEMP_O <= "0000"; elsif SET = '1' then TEMP_O <= "1111"; elsif LOAD = '1' then TEMP_O <= DATA; else
144
Глава 11. Примеры VHDL"проектов ЦУ различного назначения
SI <= TEMP_O(0); TEMP_O <= SI & TEMP_O(3 downto 1); end if; end if; end if; end process; O <= TEMP_O; end architecture;
11.1.31. Универсальный синхронный 4битный
сдвиговый регистр вправо с параллельным входом и выходом
В отличие от приведенного в подразд. 11.1.24 этот проект содержит один дополнительный вход (входной порт SI), на который может быть подан сигнал, поступающий от другого источника. По очередному пе реднему фронту тактового сигнала clk к значению соответствующего бита SI посредством операции конкатенации & подсоединяются 3 старших бита, хранящихся в регистре. Младший бит, хранящийся в та ком регистре до момента выполнения операции сдвига, теряется.
   Проект Shft_Reg  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all; entity shft_reg is
port ( CLK : in std_logic; CLR : in std_logic; SET : in std_logic; CE : in std_logic; SI : in std_logic; LOAD : in std_logic; DATA : in std_logic_vector(3 downto 0); O : out std_logic_vector(3 downto 0));
end entity; architecture shft_reg_arch of shft_reg is signal TEMP_O : std_logic_vector(3 downto 0);
11.1. Проекты ЦУ общего назначения
begin
process(CLK) begin if rising_edge(CLK) then if CE = '1' then if CLR = '1' then TEMP_O <= "0000"; elsif SET = '1' then TEMP_O <= "1111"; elsif LOAD = '1' then TEMP_O <= DATA; else TEMP_O <= SI & TEMP_O(3 downto 1); end if; end if; end if; end process; O <= TEMP_O; end architecture;
145
11.1.32. Расширитель разрядности шины знаковыми разрядами
В пакете std_logic_arith библиотеки ieee определены специ альные функции — SXT() и EXT(), которые можно использовать со ответственно для расширения знаком и дополнения нулями сигналов типа std_logic_vector. Однако эти функции напрямую не подде рживаются урезанной версией VHDL, которая используется в некото рых САПР. Выход заключается в определении этих функций как VHDLпроектов с последующим подключением этих VHDLпроектов в новые проекты в виде компонентов.
В данном подразделе рассмотрен проект Sign_Ext.vhd, предна значенный для расширения шины знаковыми разрядами. А в подразд. 11.1.33 приведен проект Zero_Ext.vhd, предназначенный для расширения шины нулями.
   Проект Sign_Ext  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++
146
Глава 11. Примеры VHDL"проектов ЦУ различного назначения
 
library ieee; use ieee.std_logic_1164.all use ieee.std_logic_arith.all entity sign_ext is
 Оператор generic используется, чтобы определить разрядность  (ширину) входных и выходных портов (векторов).
generic(WIDTH_IN : INTEGER := 4; SIZE_OUT : INTEGER := 8); port( d_in : in std_logic_vector(WIDTH_IN1 downto 0); d_out : out std_logic_vector(SIZE_OUT1 downto 0)); end sign_ext; architecture behavior of sign_ext is begin process(d_in)
variable zero: boolean; begin if (d_in(WIDTH_IN1) = '0') then zero := true; else zero := false; end if; for j in WIDTH_IN to (size_out1) loop if (zero) then d_out(j) <= '0'; else d_out(j) <= '1'; end if; end loop;
d_out(WIDTH_IN1 downto 0) <= d_in(WIDTH_IN1 downto 0);
end process; end behavior;
Субпроект Sign_Ext.vhd можно использовать в проектах более
высокого уровня в виде компонента sign_ext:
component sign_ext GENERIC (WIDTH_IN: INTEGER; SIZE_OUT: INTEGER); port ( d_in: in std_logic_vector(WIDTH_IN1 downto 0); d_out: out std_logic_vector(SIZE_OUT1 downto 0)); end component;
11.1. Проекты ЦУ общего назначения
147
11.1.33. VHDLпроект расширителя разрядности шины
нулями
   Проект Zero_Ext  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity zero_ext is
GENERIC(WIDTH_IN : INTEGER := 4; SIZE_OUT : INTEGER := 8); port( d_in : IN std_logic_vector(WIDTH_IN1 downto 0); d_out : OUT std_logic_vector(SIZE_OUT1 downto 0));
end ZERO_EXT; architecture behavior of zero_ext is begin process(d_in)
begin for j in width_in to size_out1 loop d_out(j) <= '0'; end loop; d_out(WIDTH_IN1 downto 0) <= d_in(WIDTH_IN1 downto 0);
end process; end behavior;
Субпроект Zero_Ext.vhd можно использовать в проектах более высокого уровня в виде компонента zero_ext:
component zero_ext GENERIC (WIDTH_IN: INTEGER; SIZE_OUT: INTEGER); port ( d_in: in std_logic_vector(WIDTH_IN1 downto 0); d_out: out std_logic_vector(SIZE_OUT1 downto 0)); end component;
148
Глава 11. Примеры VHDL"проектов ЦУ различного назначения
11.1.34. 8битная двунаправленная шина с тремя состояниями
   Проект BiDir  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all entity bidir is port(bidir : inout std_logic_vector (7 downto 0);
oe, clk : in std_logic; inp : in std_logic_vector (7 downto 0); outp : out std_logic_vector (7 downto 0));
end bidir; architecture maxpld of bidir is
 Внутренний сигнал, сохраняющий значения,  принимаемые с входного порта inp. signal a : std_logic_vector (7 downto 0);  Внутренний сигнал, сохраняющий значения,  передаваемые на выходной порт outp.
signal b : std_logic_vector (7 downto 0); begin process(clk)
begin if clk = '1' and clk'EVENT then a <= inp; outp <= b; end if;
end process; process (oe, bidir)
begin if (oe = '0') then bidir <= "ZZZZZZZZ"; b <= bidir; else bidir <= a; b <= bidir; end if;
end process; end maxpld;
11.1. Проекты ЦУ общего назначения
11.1.35. Процессор возведения в степень N
   Проект Ste1_uN  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++  ++++++++++++++++++ www.yskbooks.com +++++++++++++++  
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity ste1_un is
port(clk : in std_logic; pok : in ingeger range 0 to 255; x : in unsigned (63 downto 0); y : out unsigned (63 downto 0));
end ste1_un; architecture ste1_un of ste1_un is begin process(clk)
variable poka : integer range 0 to 255; variable res : unsigned (63 downto 0); variable res1 : unsigned (63 downto 0) :=
X"0000000000000001"; begin
if clk'event and clk = '1' then res1 :=x;  X"0000000000000003"; poka := pok; for i in 1 to poka loop res := resize((res * res1), 64) ; end loop; y <= res; res := X"0000000000000001";
end if; end process; end ste1_un;
149
11.1.36. Процессор нахождения факториала
   Проект Fact  +++++ Copyright © 19922007 by Yuriy Kovtanyuk +++++