Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторних робіт
з дисципліни: “Моделювання комп'ютерних систем”
Лабораторна робота № 2
Тема: Розробка та моделювання декодера для семисегментного індикатора.
Завдання: Описати на мові VHDL декодер: перша цифра – 7-сегментний індикатор, друга цифра –9-сегментний індикатор.
/
Змінити вивід цифр 1, 2, 3, 9 на 9-сегментному індикаторі таким чином:
/ / / /
Інші цифри не змінювати. Декодер повинен генерувати числа від 0 до 10.
Вихідний код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Decoder is
port(
X : in STD_LOGIC_VECTOR(3 downto 0);
Y1 : out STD_LOGIC_VECTOR(6 downto 0);
Y2 : out STD_LOGIC_VECTOR(8 downto 0)
);
end Decoder;
architecture Decoder of Decoder is
begin
process (X)
begin
case (X) is
when "0000" => Y1 <= "1110111"; Y2 <= "001110111";
when "0001" => Y1 <= "1110111"; Y2 <= "010100100";
when "0010" => Y1 <= "1110111"; Y2 <= "101000101";
when "0011" => Y1 <= "1110111"; Y2 <= "110001001";
when "0100" => Y1 <= "1110111"; Y2 <= "001001101";
when "0101" => Y1 <= "1110111"; Y2 <= "001101011";
when "0110" => Y1 <= "1110111"; Y2 <= "001111011";
when "0111" => Y1 <= "1110111"; Y2 <= "001000110";
when "1000" => Y1 <= "1110111"; Y2 <= "001111111";
when "1001" => Y1 <= "1110111"; Y2 <= "100001111";
when "1010" => Y1 <= "1110111"; Y2 <= "001110111";
when others => Y1 <= "0000000"; Y2 <= "000000000";
end case;
end process;
end Decoder;
Часова діаграма
/
Лабораторна робота № 4
Тема: Моделювання режиму очікування в цифрових пристроях за допомогою оператора wait.
Завдання: Змінити час затримки в процесах: CLK – 35 нс, Pr_B – 25 нс.
Вихідний код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity comp is
port(
--CLK : in STD_LOGIC;
Bout : out STD_LOGIC;
Ainout : inout STD_LOGIC
);
end comp;
architecture comp of comp is
signal CLK : std_logic := '0';
begin
Pr_CLK: process--(CLK)
begin
wait for 35 ns;
CLK <= not CLK;
end process Pr_CLK;
Pr_A: process--(CLK)
begin
--if CLK'event and CLK = '1' then Ainout <= '1' after 5 ns;
--elsif CLK'event and CLK = '0' then Ainout <= '0' after 5 ns;
--end if;
wait on CLK until CLK = '1';
Ainout <= '1' after 5 ns;
wait on CLK until CLK = '0';
Ainout <= '0' after 5 ns;
end process Pr_A;
Pr_B: process--(Ainout)
begin
--if Ainout'event then Bout <= not Ainout;
--end if;
wait on Ainout;
wait for 25 ns;
Bout <= not Ainout;
end process Pr_B;
end comp;
Часова діаграма
/
Лабораторна робота № 5
Тема: Розробка та моделювання паралельного регістру та регістру зсуву.
Завдання: Описати на мові VHDL паралельний регістр та регістр зсуву. Розрядність паралельногорегістра – 12, регістра зсуву – 10.
Вихідний код паралельного регістра
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Reg_Paral is
port (
DATA_IN: in STD_LOGIC_VECTOR (11 downto 0);
CLK: in STD_LOGIC;
WE: in STD_LOGIC;
RE: in STD_LOGIC;
DATA_OUT: out STD_LOGIC_VECTOR (11 downto 0)
);
end Reg_Paral;
architecture Reg_Paral of Reg_Paral is
begin
process (DATA_IN, CLK, WE, RE)
variable MEDIUM : STD_LOGIC_VECTOR (11 downto 0);
begin
if (CLK = '1' and WE = '1' and RE = '0') then MEDIUM := DATA_IN;
elsif (CLK = '1' and WE = '0' and RE = '1') then DATA_OUT <= MEDIUM;
else DATA_OUT <= "ZZZZZZZZZZZZ";
end if;
end process;
end Reg_Paral;
Часова діаграма
/
Вихідний код регістра зсуву
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Reg_Shift 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(9 downto 0)
);
end Reg_Shift;
architecture Reg_Shift of Reg_Shift is
begin
process (DATA_IN, CLK, WE, RE)
variable MEDIUM : STD_LOGIC_VECTOR (9 downto 0);
begin
if (CLK = '1' and WE = '1' and RE = '0') then
for i in 8 downto 0 loop
MEDIUM(i + 1) := MEDIUM(i);
end loop;
MEDIUM(0) := DATA_IN;
elsif (CLK = '1' and WE = '0' and RE = '1' and
(MEDIUM(9) = '1' or MEDIUM(9) = '0')) then
DATA_OUT <= MEDIUM;
else DATA_OUT <= "ZZZZZZZZZZ";
end if;
end process;
end Reg_Shift;
Часова діаграма
/
Лабораторна робота № 6
Тема: Проектування постійного запам'ятовуючого пристрою.
Завдання: Описати на мові VHDL ПЗП розрядністю 7, який приймає на вході адресу розрядністю 3 біти.
Вихідний код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity rom is
port(
CEO : in STD_LOGIC;
Addr : in STD_LOGIC_VECTOR(2 downto 0);
Dout : out STD_LOGIC_VECTOR(6 downto 0)
);
end rom;
architecture rom of rom is
type ARR is array (7 downto 0) of STD_LOGIC_VECTOR(6 downto 0);
constant MEMORY : ARR := ( "0000000", "0000001", "0000010", "0000100",
"0001000", "0010000", "0100000", "1000000" );
begin
process
begin
wait on CEO;
if CEO = '1' then
Dout <= MEMORY(conv_integer(Addr));
else
Dout <= "UUUUUUU";
end if;
end process;
end rom;
Часова діаграма
/
Лабораторна робота № 7
Тема: Проектування сканеру клавіатури із застосуванням діаграм скінчених автоматів для опису об'єктів в САПР Active-HDL.
Завдання: Спроектувати сканеру клавіатури, натиснути клавішу “5”.
Діаграма автомата
/
Вихідний код
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity Keyboard is
port (
CLK: in STD_LOGIC;
Ret: in STD_LOGIC_VECTOR (3 downto 0);
KeyCode: out STD_LOGIC_VECTOR (7 downto 0);
Strobe: out STD_LOGIC;
Scan: inout STD_LOGIC_VECTOR (3 downto 0));
end Keyboard;
architecture Keyboard_arch of Keyboard is
-- diagram signals declarations
signal Cond: STD_LOGIC;
-- SYMBOLIC ENCODED state machine: Sreg0
type Sreg0_type is (
S0, S1, S2, S3, S4, S5
);
-- attribute enum_encoding of Sreg0_type: type is ... -- enum_encoding attribute is not supported for symbolic encoding
signal Sreg0: Sreg0_type;
begin
----------------------------------------------------------------------
-- Machine: Sreg0
----------------------------------------------------------------------
Sreg0_machine: process (CLK)
begin
if CLK'event and CLK = '1' then
-- Set default values for outputs, signals and variables
-- ...
case Sreg0 is
when S0 =>
Scan <= "1111";
Strobe <= '0';
if Cond = '1' then
Sreg0 <= S1;
elsif Cond = '0' then
Sreg0 <= S0;
end if;
when S1 =>
Scan <= "0001";
if Cond = '0' then
Sreg0 <= S2;
elsif Cond = '1' then
Sreg0 <= S5;
end if;
when S2 =>
Scan <= "0010";
if Cond = '0' then
Sreg0 <= S3;
elsif Cond = '1' then
Sreg0 <= S5;
end if;
when S3 =>
Scan <= "0100";
if Cond = '0' then
Sreg0 <= S4;
elsif Cond = '1' then
Sreg0 <= S5;
end if;
when S4 =>
Scan <= "1000";
if Cond = '0' then
Sreg0 <= S0;
elsif Cond = '1' then
Sreg0 <= S5;
end if;
when S5 =>
Strobe <= '1';
if Cond = '0' then
Sreg0 <= S0;
elsif Cond = '1' then
Sreg0 <= S5;
end if;
--vhdl_cover_off
when others =>
null;
--vhdl_cover_on
end case;
end if;
end process;
-- signal assignment statements for combinatorial outputs
KeyCode_assignment:
KeyCode <= Ret & Scan when (Sreg0 = S5) else
"00000000" when (Sreg0 = S0) else
"00000000";
Cond_assignment:
Cond <= Ret(0) or Ret(1) or Ret(2) or Ret(3);
end Keyboard_arch;
Часова діаграма
/
Лабораторна робота № 8
Тема: Використання блок-діаграм для декомпозиції складних пристроїв в САПР Active-HDL.
Завдання: Створити блок-генератор сигналів для 8-розрядного 7-сегментного індикатора. Декодер розряду індикатора та паралельний регістр (моделі яких було розроблено в лабораторних роботах № 2 і № 5) мають входити до проекту як структурні складові.
Інтерфейс генератора сигналів містить:
вхідний 32-розрядний порт Х типу std_logic_vector (31 downto 0), на який у двійково-десятковій формі подається 8-розрядне десяткове число (на кожний десятковий розряд по 4 двійкові розряди);
вхідний порт WE типу std_logic, подання '1' на який дозволяє запис у проміжний регістр блоку;
сигнал синхронізації CLK типу std_logic;
вісім 7-розрядних вихідних портів LCD7 … LCD0 типу std_logic_vector (6 downto 0), що підключаються безпосередньо до відповідних розрядів 7-сегментного індикатора.
Діаграма автомата
/
Вихідний код
Reg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Reg is
generic (size : INTEGER := 32);
port (
DATA_IN: in STD_LOGIC_VECTOR (size - 1 downto 0);
CLK: in STD_LOGIC;
WE: in STD_LOGIC;
DATA_OUT: out STD_LOGIC_VECTOR (size - 1 downto 0)
);
end Reg;
architecture Reg of Reg is
begin
process (DATA_IN, CLK, WE)
variable MEDIUM : STD_LOGIC_VECTOR (size - 1 downto 0);
begin
if rising_edge(CLK) then
if WE = '1'
then MEDIUM := DATA_IN;
elsif WE = '0'
then DATA_OUT <= MEDIUM;
else
for i in size - 1 downto 0 loop
DATA_OUT(i) <= 'Z';
end loop;
end if;
end if;
end process;
end Reg;
DeMux.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity DeMux is
port(
CLK : in STD_LOGIC;
X : in STD_LOGIC_VECTOR(31 downto 0);
Y7 : out STD_LOGIC_VECTOR(3 downto 0);
Y6 : out STD_LOGIC_VECTOR(3 downto 0);
Y5 : out STD_LOGIC_VECTOR(3 downto 0);
Y4 : out STD_LOGIC_VECTOR(3 downto 0);
Y3 : out STD_LOGIC_VECTOR(3 downto 0);
Y2 : out STD_LOGIC_VECTOR(3 downto 0);
Y1 : out STD_LOGIC_VECTOR(3 downto 0);
Y0 : out STD_LOGIC_VECTOR(3 downto 0)
);
end DeMux;
architecture DeMux of DeMux is
begin
process(CLK)
begin
if rising_edge(CLK) then
Y0 <= X(3 downto 0);
Y1 <= X(7 downto 4);
Y2 <= X(11 downto 8);
Y3 <= X(15 downto 12);
Y4 <= X(19 downto 16);
Y5 <= X(23 downto 20);
Y6 <= X(27 downto 24);
Y7 <= X(31 downto 28);
end if;
end process;
end DeMux;
LEDconv.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity LEDconv is
port(
X : in STD_LOGIC_VECTOR(3 downto 0);
Y : out STD_LOGIC_VECTOR(6 downto 0)
);
end LEDconv;
architecture LEDconv of LEDconv is
begin
process (X)
begin
case (X) is
when "0000" => Y <= "1110111";
when "0001" => Y <= "1000100";
when "0010" => Y <= "0111110";
when "0011" => Y <= "1101110";
when "0100" => Y <= "1001101";
when "0101" => Y <= "1101011";
when "0110" => Y <= "1111011";
when "0111" => Y <= "1000110";
when "1000" => Y <= "1111111";
when "1001" => Y <= "1101111";
when others => Y <= "0000000";
end case;
end process;
end LEDconv;
Diagram.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity Diagram is
port(
CLK : in STD_LOGIC;
WE : in STD_LOGIC;
X : in STD_LOGIC_VECTOR(31 downto 0);
LCD0 : out STD_LOGIC_VECTOR(6 downto 0);
LCD1 : out STD_LOGIC_VECTOR(6 downto 0);
LCD2 : out STD_LOGIC_VECTOR(6 downto 0);
LCD3 : out STD_LOGIC_VECTOR(6 downto 0);
LCD4 : out STD_LOGIC_VECTOR(6 downto 0);
LCD5 : out STD_LOGIC_VECTOR(6 downto 0);
LCD6 : out STD_LOGIC_VECTOR(6 downto 0);
LCD7 : out STD_LOGIC_VECTOR(6 downto 0)
);
end Diagram;
architecture Diagram of Diagram is
---- Component declarations -----
component DeMux
port (
CLK : in STD_LOGIC;
X : in STD_LOGIC_VECTOR(31 downto 0);
Y0 : out STD_LOGIC_VECTOR(3 downto 0);
Y1 : out STD_LOGIC_VECTOR(3 downto 0);
Y2 : out STD_LOGIC_VECTOR(3 downto 0);
Y3 : out STD_LOGIC_VECTOR(3 downto 0);
Y4 : out STD_LOGIC_VECTOR(3 downto 0);
Y5 : out STD_LOGIC_VECTOR(3 downto 0);
Y6 : out STD_LOGIC_VECTOR(3 downto 0);
Y7 : out STD_LOGIC_VECTOR(3 downto 0)
);
end component;
component LEDconv
port (
X : in STD_LOGIC_VECTOR(3 downto 0);
Y : out STD_LOGIC_VECTOR(6 downto 0)
);
end component;
component Reg
generic(
size : INTEGER := 32
);
port (
CLK : in STD_LOGIC;
DATA_IN : in STD_LOGIC_VECTOR(size-1 downto 0);
WE : in STD_LOGIC;
DATA_OUT : out STD_LOGIC_VECTOR(size-1 downto 0)
);
end component;
---- Signal declarations used on the diagram ----
signal BUS2208 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2222 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2236 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2250 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2281 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2321 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2330 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2339 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS5300 : STD_LOGIC_VECTOR (31 downto 0);
begin
---- Component instantiations ----
U0 : LEDconv
port map(
X => BUS2321,
Y => LCD0
);
U1 : LEDconv
port map(
X => BUS2330,
Y => LCD1
);
U2 : LEDconv
port map(
X => BUS2339,
Y => LCD2
);
U3 : LEDconv
port map(
X => BUS2281,
Y => LCD3
);
U4 : LEDconv
port map(
X => BUS2250,
Y => LCD4
);
U5 : LEDconv
port map(
X => BUS2236,
Y => LCD5
);
U6 : LEDconv
port map(
X => BUS2222,
Y => LCD6
);
U7 : LEDconv
port map(
X => BUS2208,
Y => LCD7
);
U8 : DeMux
port map(
CLK => CLK,
X => BUS5300,
Y0 => BUS2321,
Y1 => BUS2330,
Y2 => BUS2339,
Y3 => BUS2281,
Y4 => BUS2250,
Y5 => BUS2236,
Y6 => BUS2222,
Y7 => BUS2208
);
U9 : Reg
port map(
CLK => CLK,
DATA_IN => X( 31 downto 0 ),
DATA_OUT => BUS5300( 31 downto 0 ),
WE => WE
);
end Diagram;
Часова діаграма
/
Лабораторна робота № 9
Тема: Синтез та моделювання спеціалізованого пристрою.
Завдання: В лабораторній роботі проводиться:
Проектування, симуляція та верифікація спеціалізованого пристрою, спроектованого в лабораторній роботі № 8.
Синтез, функціональне моделювання, трасування, та часова симуляція спеціалізованого пристрою для реалізації його в ПЛІС фірми Xilinx.
Вихідний код
В даній лабораторній роботі використовуються всі вихідні файли з лабораторної роботи № 8 (Diagram.vhd, Reg.vhd, DeMux.vhd, LEDconv.vhd), а також файл тестового стенду testbench.vhd.
testbench.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE testbench OF testbench IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT Diagram
PORT(
CLK : IN std_logic;
WE : IN std_logic;
X : IN std_logic_vector(31 downto 0);
LCD0 : OUT std_logic_vector(6 downto 0);
LCD1 : OUT std_logic_vector(6 downto 0);
LCD2 : OUT std_logic_vector(6 downto 0);
LCD3 : OUT std_logic_vector(6 downto 0);
LCD4 : OUT std_logic_vector(6 downto 0);
LCD5 : OUT std_logic_vector(6 downto 0);
LCD6 : OUT std_logic_vector(6 downto 0);
LCD7 : OUT std_logic_vector(6 downto 0)
);
END COMPONENT;
--Inputs
signal CLK : std_logic := '0';
signal WE : std_logic := '0';
signal X : std_logic_vector(31 downto 0) := (others => '0');
--Outputs
signal LCD0 : std_logic_vector(6 downto 0);
signal LCD1 : std_logic_vector(6 downto 0);
signal LCD2 : std_logic_vector(6 downto 0);
signal LCD3 : std_logic_vector(6 downto 0);
signal LCD4 : std_logic_vector(6 downto 0);
signal LCD5 : std_logic_vector(6 downto 0);
signal LCD6 : std_logic_vector(6 downto 0);
signal LCD7 : std_logic_vector(6 downto 0);
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: Diagram PORT MAP (
CLK => CLK,
WE => WE,
X => X,
LCD0 => LCD0,
LCD1 => LCD1,
LCD2 => LCD2,
LCD3 => LCD3,
LCD4 => LCD4,
LCD5 => LCD5,
LCD6 => LCD6,
LCD7 => LCD7
);
-- Clock process definitions
CLK_process :process
begin
CLK <= '0';
wait for 10 ns;
CLK <= '1';
wait for 10 ns;
end process;
-- Stimulus process
process
begin
wait until CLK = '1';
WE <= '1';
X <= "00000001001000110100010101100111";
wait until CLK = '1';
WE <= '0';
end process;
END;
Часова діаграма
В середовищі Aldec Active-HDL
/
В середовищі Xilinx ISE WebPack
/