Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра «ЕОМ»
Звіт
Лабораторна робота №5
Розробка та моделювання паралельного регістру та регістру зсуву
Мета роботи: Засвоїти принципи роботи паралельного та зсувного регістрів. Навчитися описувати синхронізовані процеси та використовувати циклічні оператори при описі поведінки об'єктів за допомогою VHDL.
Опис операторів циклу, що використовуються у VHDL:
У VHDL існує два оператора цикла:
оператор циклу з умовою while ... loop ...
оператор циклу з лічильником for ... loop ... .
Оператор умовного циклу починається з логічної умови. Цикл повторюється до тих пір, поки виконується умова на початку циклу. Спочатку перевіряється умова, і, якщо вона істинна, виконуються оператори всередині циклу. Якщо ж умова хибна, цикл вважається закінченим і керування передається першому оператору, що знаходиться після циклу.
Як правило, такі цикли використовуються для повторення виконання групи операторів до тих пір, поки сигнал або змінна відповідають вибраному критерію (наприклад, дорівнюють деякому значенню).
Приклад використання умовного оператора циклу:
processvariable Count : integer := 0;begin wait until CLK = '1';
while Level = '1' loop
Count := Count + 1;
wait until CLK = '0';
end loop;
end process;
Цикл з лічильником не містить явної булевої умови. Замість цього задається дискретний лічильник із діапазоном значень і цикл повторюється до тих пір, поки цей лічильник не вийде за межі діапазона. Після кожної ітерації циклу лічильнику присвоюється наступне значення із заданого діапазону. Лічильник, який не обов'язково декларувати (його специфікація в заголовку циклу прирівнюється до декларації) всередині циклу вважається константою і може використовуватись в присвоєннях, індексах виразів, але не може бути змінене. Більше того, лічильник існує тільки всередині циклу, в якому він задекларований.
Діапазон лічильника можна задавати не тільки в класичній формі вигляду from … to …. Він може бути також заданий як підтип або перечислимий тип. В такому випадку тільки (під)тип задається в якості діапазону лічильника.
Опис алгоритмів роботи розроблених регістрів:
Паралельний 8-розрядний регістр
у стані збереження байта на виході регістра постійно утримується високий імпеданс ("ZZZZZZZZ"), що дозволить організувати роботу декількох регістрів через одну шину, оскільки сигнал високого імпедансу має найнижчий пріоритет;
якщо WE = '1' і RE = '0', то здійснюється запис інформації в регістр;
якщо WE = '0' і RE = '1', то на вихід регістра подається значення байта, що зберігається в цьому регістрі;
всі інші комбінації WE та RE розглядаються як стан збереження байта;
робота регістра має бути синхронізована по сигналу CLK.
Зсувний 8-розрядний регістр
у стані збереження байта на виході регістра постійно утримується високий імпеданс ("ZZZZZZZZ");
якщо WE = '1' і RE = '0', то здійснюється запис інформації в регістр, при цьому сигнал DATA_IN надходить в DATA_OUT(0), значення DATA_OUT(0) переміщується в DATA_OUT(1) і т.д.;
якщо WE = '0' і RE = '1', то на вихід регістра подається значення байта, що зберігається в цьому регістрі;
всі інші комбінації WE та RE розглядаються як стан збереження байта;
робота регістра має бути синхронізована по сигналу CLK.
Тексти VHDL-кодів, що описують поведінку паралельного та зсувного регістрів:
Паралельний 8-розрядний регістр
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity parallel_reg is
port(
CLK : in STD_LOGIC;
WE : in STD_LOGIC;
RE : in STD_LOGIC;
DATA_IN : in STD_LOGIC_VECTOR(7 downto 0);
DATA_OUT : out STD_LOGIC_VECTOR(7 downto 0));
end parallel_reg;
architecture parallel_reg of parallel_reg is
begin
process (CLK)
variable DATA: STD_LOGIC_VECTOR(7 downto 0);
begin
if CLK'event and CLK = '1' then
if WE = '1' and RE = '0' then
DATA := DATA_IN;
elsif WE = '0' and RE = '1' then
DATA_OUT <= DATA;
else
DATA_OUT <= "ZZZZZZZZ";
end if;
end if;
end process;
end parallel_reg;
Зсувний 8-розрядний регістр
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity shift_reg is
port(
DATA_IN : in STD_LOGIC;
CLK : in STD_LOGIC;
WE : in STD_LOGIC;
RE : in STD_LOGIC;
DATA_OUT : out STD_LOGIC_VECTOR(7 downto 0));
end shift_reg;
architecture shift_reg of shift_reg is
begin
process (CLK)
variable DATA: STD_LOGIC_VECTOR(7 downto 0);
begin
if CLK'event and CLK = '1' then
if WE = '1' and RE = '0' then
for i in 7 downto 1 loop
DATA(i) := DATA(i - 1);
end loop;
DATA(0) := DATA_IN;
elsif WE = '0' and RE = '1' then
DATA_OUT <= DATA;
else
DATA_OUT <= "ZZZZZZZZ";
end if;
end if;
end process;
end shift_reg;
Часові діаграми роботи регістрів:
Паралельний 8-розрядний регістр
Зсувний 8-розрядний регістр
Висновки: Мова VHDL має оператори циклу for та while. Цикл while використовує умову для виходу/продовження з циклу, а цикл for використовується коли наперед відомо скільки ітерацій потрібно зробити.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!