Бабак VHDL
.pdf
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.89битный накапливающий/вычитающий счетчик с выбором направления счета
|
Проект 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. Проекты ЦУ общего назначения 141
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;
11.1.29.N9битный накапливающий счетчик со счетным входом, синхронной загрузкой и асинхронным сбросом
Счетчик сбрасывается в 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.Синхронный 49битный циклический сдвиговый регистр вправо с параллельным входом и выходом
Этот регистр выполняет операцию циклического сдвига вправо только при наличии (обнаружении) очередного переднего фронта так тового сигнала 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.Универсальный синхронный 49битный сдвиговый регистр вправо с параллельным входом и выходом
В отличие от приведенного в подразд. 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. Проекты ЦУ общего назначения 145
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;
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.VHDL9проект расширителя разрядности шины нулями
|
Проект 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. 89битная двунаправленная шина с тремя состояниями
|
Проект 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. Проекты ЦУ общего назначения 149
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;
11.1.36. Процессор нахождения факториала
|
Проект Fact |
|
+++++ Copyright © 1992 2007 by Yuriy Kovtanyuk +++++ |
