Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
download-1402550944935.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
660.48 Кб
Скачать

3.3. Реализация проекта при помощи языка vhdl.

В этом разделе мы реализуем проект, аналогичный по функциональности проекту предыдущего раздела, но на этот раз – с применением VHDL.

Итак, создадим второй проект, который назовем VHDL_Project. Добавим в него исходник VHDL-кода, для этого в уже известном нам диалоговом окне укажем параметры, как на рисунке 3.3.1.

Рис. 3.3.1.

Нажимаем кнопку Next. Появляется диалоговое окно, в котором нужно указать входы и выходы создаваемого блока. Укажем их в соответствии со схемой из предыдущего раздела, см. рисунок 3.3.2.

Рис. 3.3.2.

После этого нажимаем Next и убедившись в следующем диалоговом окне с краткой информацией о создаваемом файле, что всё верно, нажимаем Finish.

В результате будет создан код, представленный на листинге 3.3.1.

Листинг 3.3.1.

----------------------------------------------------------------------------------

-- Company:

-- Engineer:

--

-- Create Date: 14:55:56 03/06/2009

-- Design Name:

-- Module Name: main_vhdl - Behavioral

-- Project Name:

-- Target Devices:

-- Tool versions:

-- Description:

--

-- Dependencies:

--

-- Revision:

-- Revision 0.01 - File Created

-- Additional Comments:

--

----------------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity main_vhdl is

Port ( Clock : in STD_LOGIC;

Button : in STD_LOGIC;

Segment_A : out STD_LOGIC;

Segment_B : out STD_LOGIC;

Segment_C : out STD_LOGIC;

Segment_D : out STD_LOGIC;

Segment_E : out STD_LOGIC;

Segment_F : out STD_LOGIC;

Segment_G : out STD_LOGIC);

end main_vhdl;

architecture Behavioral of main_vhdl is

begin

end Behavioral;

Чтобы реализовать нужную нам функциональность, нужно ввести код, представленный на листинге 3.3.2. В коде даны комментарии, проводящие параллель между описанием схемы из предыдущего раздела и непосредственно самим кодом.

Листинг 3.3.2.

----------------------------------------------------------------------------------

-- Company:

-- Engineer:

--

-- Create Date: 14:55:56 03/06/2009

-- Design Name:

-- Module Name: main_vhdl - Behavioral

-- Project Name:

-- Target Devices:

-- Tool versions:

-- Description:

--

-- Dependencies:

--

-- Revision:

-- Revision 0.01 - File Created

-- Additional Comments:

--

----------------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity main_vhdl is

Port ( Clock : in STD_LOGIC;

Button : in STD_LOGIC;

Segment_A : out STD_LOGIC;

Segment_B : out STD_LOGIC;

Segment_C : out STD_LOGIC;

Segment_D : out STD_LOGIC;

Segment_E : out STD_LOGIC;

Segment_F : out STD_LOGIC;

Segment_G : out STD_LOGIC);

end main_vhdl;

architecture Behavioral of main_vhdl is

signal Button_Sync: std_logic;

signal Button_Sync_NoMS: std_logic;

signal Button_Sync_NoMS_Delayed: std_logic;

signal Button_Pulse: std_logic;

signal Count: integer range 0 to 4;

signal Reset: std_logic;

signal Count_Bus: std_logic_vector (1 downto 0);

begin

-- Три D-триггера: для синхронизации, защиты от метастабильности и задержки сигнала

process (Clock)

begin

if rising_edge(Clock) then -- условие переднего фронта сигнала Clock

Button_Sync <= Button;

Button_Sync_NoMS <= Button_Sync;

Button_Sync_NoMS_Delayed <= Button_Sync_NoMS;

end if;

end process;

-- Преобразование фронта в короткий импульс

Button_Pulse <= Button_Sync_NoMS and not Button_Sync_NoMS_Delayed;

-- Двоичный счетчик

process (Clock)

begin

if (Reset = '1') then -- асинхронный сброс счетчика, здесь его нужно сделать вручную

Count <= 0;

elsif rising_edge(Clock) then

if (Button_Pulse = '1') then -- сигнал разрешения работы счетчика

Count <= Count + 1;

end if;

end if;

end process;

-- Компаратор (проверяет, досчитал ли счетчик до 3 и выдает сигнал сброса)

process (Clock)

begin

if rising_edge(Clock) then

if (Count > 3) then

Reset <= '1';

else

Reset <= '0';

end if;

end if;

end process;

-- преобразовываем переменную Count в двухразрядную шину

Count_Bus <= CONV_STD_LOGIC_VECTOR(Count, 2);

-- Семисегментный дешифратор, здесь он выполняется простым case

process (Clock)

begin

case (Count_Bus) is

when "00" =>

Segment_A <= '1';

Segment_B <= '1';

Segment_C <= '1';

Segment_D <= '1';

Segment_E <= '1';

Segment_F <= '1';

Segment_G <= '0';

when "01" =>

Segment_A <= '0';

Segment_B <= '1';

Segment_C <= '1';

Segment_D <= '0';

Segment_E <= '0';

Segment_F <= '0';

Segment_G <= '0';

when "10" =>

Segment_A <= '1';

Segment_B <= '1';

Segment_C <= '0';

Segment_D <= '1';

Segment_E <= '1';

Segment_F <= '0';

Segment_G <= '1';

when "11" =>

Segment_A <= '1';

Segment_B <= '1';

Segment_C <= '1';

Segment_D <= '1';

Segment_E <= '0';

Segment_F <= '0';

Segment_G <= '1';

when others =>

end case;

end process;

end Behavioral;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]