Головна сторінка Випадкова сторінка КАТЕГОРІЇ: АвтомобіліБіологіяБудівництвоВідпочинок і туризмГеографіяДім і садЕкологіяЕкономікаЕлектронікаІноземні мовиІнформатикаІншеІсторіяКультураЛітератураМатематикаМедицинаМеталлургіяМеханікаОсвітаОхорона праціПедагогікаПолітикаПравоПсихологіяРелігіяСоціологіяСпортФізикаФілософіяФінансиХімія |
Теоретичні положення, що складають зміст теми № 4Дата добавления: 2014-12-06; просмотров: 740
Library IEEE; Use IEEE.Std_logic_1164.All;
Entity buf is Port(a: in Std_logic; B: out Std_logic); end buf;
Architecture buf of buf is Begin b<=a after 10 ns; end buf;
Использование транспортной задержки.
Library IEEE; Use IEEE.Std_logic_1164.All;
Entity delay_line is Port(a: in Std_logic; B: out Std_logic); end delay_line;
Architecture delay_line of delay_line is Begin b<= Transport a after 10 ns; end delay_line;
Для получения четкого представления о механизмах обоих типов задержек, необходимо подать на вход смоделированного в обеих программах устройства импульсы, длительностью менее 10 наносекунд, а затем длительностью более 10 нс. Если механизм задержки электронных компонентов не задается, то VHDL симулятор использует в своих вычислениях механизм δ-задержки. Т.о. инерционная задержка определяется исключительно внутренними свойствами самого электронного компонента, тогда как транспортные задержки – внешними соединениями ИМС, например, свойствами печатного монтажа. Обычно, транспортные задержки сигнала не превышают нескольких наносекунд, однако, поскольку рассматриваемые электронные компоненты фирмы "Altera" представляют собой высокоскоростные цифровые устройства, работающие на высоких частотах в реальном масштабе времени, такой порядок задержек может оказаться существенным, и, прежде всего, с точки зрения их влияния на однозначность логики работы проектируемых устройств. Механизм инерционной задержки, обычно, рассматривают на последних стадиях проектирования, при окончательной отработке проекта.
Пакеты и конфигурации.
Пакет (Package) определяет группу логически связанных понятий (типы, объекты, данные этих типов и подпрограммы с параметрами этих типов). В большинстве языков программирования высокого уровня имеется такое понятие, как "Программный модуль". Программный модуль может подключаться к основной программе. Любой пакет состоит из декларации (описания) и тела, т.е. из интерфейсной и внутренней частей. Интерфейсная часть определяет характер взаимодействия этого пакета с другими пакетами. Внутренняя часть представляет содержание этого пакета. В некоторых случаях пакет может содержать только интерфейсную часть, например, при определении переменных своего типа, тело пакета в этом случае будет пустым, т.е. формально тело будет присутствовать в пакете, но будет состоять только из заголовка и слова "end". Пакет может быть оттранслирован в некоторый объектный код и в дальнейшем при необходимости использования заложенных в него процедур и функций достаточно будет лишь подключить этот пакет к основной программе. Декларация пакета содержит описание всех понятий, которые могут быть в явном виде использованы вне пакета. Тело пакета содержит подпрограммы, процедуры и функции, которые определены в интерфейсной части пакета, а так же содержит определение локальных имен и переменных, которые использованы внутри пакета. Любое описание, которое содержится в интерфейсной части, доступно из некоторого VHDL блока, если пакет предварительно скомпилирован в одной из библиотек проекта, а VHDL блок ссылается на этот пакет(Use <имя пакета>). Рассмотрим пример описания пакета, в котором содержатся два типа данных – восьмиразрядный битовый вектор (Eight_bit) и четырехразрядный битовый вектор (Four_bit), а так же описание функции "Сдвиг вправо" (Shift_Right).
--Интерфейсная часть Package my_pack is Sub type eight: bit is bit_vector (0 to 7); Sub type four: bit is bit_vector (0 to 3); Function Shift_right (val: bit_vector) Return bit_vector; End my_pack;
--Тело пакета Package body my_pack is Function Shift_right (val: bit_vector) Return bit_vector; Variable result (bit_vector (0 to val'length – 1)) Begin Result:= val; If (val'length > 1) then For i in 0 to (val_length – 2) loop Result(i):=Result(i + 1); End loop; Result(val_length – 1):= '0'; Else result(0):= '0'; End if; Return Result; End Shift_right; End my_pack;
Для подключения этого пакета после его компиляции к какому-либо проекту, достаточно лишь вписать в начале текстового файла этого проекта следующую строку:
"Use my_pack;"
В этом случае, определенные в данном пакете типы ("восьмиразрядный вектор" и "четырехразрядный вектор", а так же функция "Сдвиг вправо") будут доступны из этого проекта.
Примеры VHDL – проектов
Library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all;
entity Clk is generic(constant t:natural:=2 ns); port( clock: out std_ulogic); end entity Clk; architecture aaa of Clk is Signal c:std_ulogic:='0'; begin Process(c) begin if (c='0') then c<='1' after t; c<='0' after 2*t; end if; clock<=c; end process; end;
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
entity pr1 is port(clk: out bit:='0'); constant high_time, low_time: time:=0.5 sec; end pr1;
architecture sequential of pr1 is begin exlicit_waits: process begin clk<='1'; wait for high_time; clk<='0'; wait for low_time; end process; end sequential;
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;
entity pr2 is port(A: in std_logic_vector(7 downto 0); B: out std_logic_vector(7 downto 0); C: in std_logic); end pr2;
architecture Behavior of pr2 is
Begin Process(A,C) begin if C='1' and (c'event) then B<=A; end if; end process; End Behavior;
-- Т-триггер с работой по отрицательному перепаду
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;
entity pr3 is port(C: in std_logic; q: out std_logic); end pr3;
architecture Beh of pr3 is Signal d: std_logic:='0';
Begin Process(C) begin if C='0' and (c'event) then d<=not d; q<=d;
-- для работы по положительному перепаду -- if C='1' and (c'event) then d<=not d; q<=d;
end if; end process;
library IEEE; use IEEE.std_logic_1164.all; -- defines std_logic types
entity pr7 is port ( clk : in STD_LOGIC; q : buffer STD_LOGIC_VECTOR (7 downto 0) );
end pr7;
architecture jcounter_arch of pr7 is begin
process (CLK) begin if CLK'event and CLK='1' then -- CLK rising edge q(7 downto 1) <= q(6 downto 0); -- Shift lower bits q (0) <= not q(7); -- Circulate inverted MSB end if; end process;
end jcounter_arch;
LIBRARY IEEE; USE IEEE.std_logic_1164.ALL;
ENTITY delay_line_tb IS --------------------- END delay_line_tb;
ARCHITECTURE delay_line_tb OF delay_line_tb IS COMPONENT delay_line PORT( a : IN STD_LOGIC; b : OUT STD_LOGIC); END COMPONENT;
signal sa : STD_LOGIC:='0'; signal sb : STD_LOGIC; BEGIN dut: delay_line; port (a => sa; b => sb); sa<='1'after 5 ns, '0'after 8 ns, '1'after 10 ns, '0'after 25 ns, '1'after 28 ns, '0'after 30 ns, '1'after 45 ns, '0'after 48 ns; end delay_line_tb;
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity proj8 is port(s,r:inout bit; q, nq:inout bit); end proj8;
architecture Behavior of proj8 is
Begin s<='1'; r<='1'; gen1: process begin s<='0' after 50 ns, '1' after 80 ns ; wait on s; end process;
gen2: process begin r<='0' after 20 ns, '1' after 30 ns ; wait for 120 ns; end process; process begin if s='0' and r='1' then q<='1'; nq<='0'; elsif s='1' and r='0' then q<='0'; nq<='1'; end if; assert not(s='0' and r='0') report "ошибка: s,r=0" severity warning; wait on s,r; end process; End Behavior;
%===============================================% % Функция M_GENERATE % % Генерирует М-последовательность, заданную % % характеристическим многочленом М % % % % Входы: % % M - вход многочлена; % % GENA - разрешение генерации (default=GND);% % CLK - тактовый вход; % % LOAD - вход предустановки (default=GND); % % Выходы: % % OUT - выход М-последовательности % % % % Параметры: % % M_WIDTH - длина полинома; % % M_BEGIN - начальное состояние % %===============================================%
INCLUDE lpm_xor.inc; INCLUDE lpm_constant.inc; PARAMETERS ( M_WIDTH, M_BEGIN = 0 ); SUBDESIGN m_generate ( M[M_WIDTH-1..0] : INPUT = GND; CLK : INPUT; GENA : INPUT = GND; LOAD : INPUT = GND; OUT : OUTPUT; ) VARIABLE dffs[M_WIDTH-2..0] : DFFE; - триггеры регистра сдвига shift_node[M_WIDTH-2..0] : NODE; xor_node[M_WIDTH-2..0] : NODE; shiftin, shiftout : NODE; - вход и выход регистра сдвига IF (USED(M_BEGIN)) GENERATE ac : lpm_constant WITH (LPM_WIDTH = M_WIDTH, LPM_CVALUE = M_BEGIN); END GENERATE; BEGIN ASSERT (M_WIDTH>0) REPORT «Значение параметра M_WIDTH должно быть больше нуля» SEVERITY ERROR;
% --------------------- общие выводы триггеров ------------------------% dffs[].ena = GENA; dffs[].clk = CLK; % ---------------------- асинхронные операции ------------------------- % IF (USED(M_BEGIN)) GENERATE dffs[].clrn = !load # ac.result[M_WIDTH-2..0]; % установка начального состояния % dffs[].prn = !load # !ac.result[M_WIDTH-2..0]; % триггеров, заданное M_BEGIN % ELSE GENERATE dffs[M_WIDTH-3..0].clrn = !load; % установка начального состояния % dffs[M_WIDTH-2].prn = !load; % триггеров «10000..00 % END GENERATE;
% ----------------------- обратные связи ---------------------- % xor_node[] = dffs[] & M[M_WIDTH-2..0]; shiftin = lpm_xor(xor_node[]) WITH (LPM_SIZE = M_WIDTH-1, LPM_WIDTH=1); % ---------------------- операции сдвига ---------------------- % shift_node[] = (shiftin, dffs[M_WIDTH-2..1]); shiftout = dffs[0]; %--------------------- синхронные операции ----------------- % dffs[].d = !load & shift_node[]; %----------------------- подключим выход ------------------- % OUT = shiftout; END;
--Преобразователь кода представляет собой устройство, на вход которого подается n-битное число в параллельном коде «d», сигнал загрузки «load» и синхроимпульсы «clk». По сигналу загрузки происходит запись входного слова во внутренний регистр и последовательная выдача в течение n тактов этого входного слова в последовательном коде на выходе «о» синхроимпульсами «oclk». После окончания преобразования на выходе «e» появляется высокий уровень сигнала в течение одного такта. Такого рода преобразователи кода часто используются для управления синтезаторами частот 1104ПЛ1 и им подобными.
library ieee; use ieee.std_logic_1164.all; entity Serial is port ( clk : in STD_LOGIC; load : in STD_LOGIC; reset: in STD_LOGIC; d : in STD_LOGIC_vector (3 downto 0); oclk : out STD_LOGIC; o : out STD_LOGIC; e : out STD_LOGIC ); end; architecture behavioral of Serial is type t1 is range 0 to 4; signal s : STD_LOGIC_vector (2 downto 0); signal i : t1; begin process (clk) begin if reset = '1' then i <= 0; else if (clk'event and clk='1') then if (i = 0 and load = '1') then s(2 downto 0) <= d(3 downto 1); o <= d(0); i <= 4; end if; if (i > 1) then o <= s(0); s(1 downto 0) <= s(2 downto 1); i <= i - 1; end if; if (i = 1) then e <= '1'; i <= 0; else e <= '0'; end if; end if; end if; if i>=0 then oclk <= not clk; else oclk <= '0'; end if; end process; end behavioral; ОБЩЕПСИХОЛОГИЧЕСКИЙ ПРАКТИКУМ
|