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

Бабак VHDL

.pdf
Скачиваний:
0
Добавлен:
05.06.2026
Размер:
2.21 Mб
Скачать

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 +++++