Автор: Пользователь скрыл имя, 28 Марта 2013 в 12:13, курсовая работа
Целью курсовой работы является разработать проект “Музыкальный синтезатор” используя ПЛИС фирмы Xilinx в среде проектирования XilinxISE.
Для программирования логики работы синтезатора использовался язык VHDL ((Very high speed integrated circuits) Hardware Description Language).
Язык VHDL - это международный стандарт в области автоматизации проектирования цифровых систем.Средствами языка VHDL возможно проектирование на различных уровнях абстракции (поведенческом или алгоритмическом, регистровых передач, структурном), в соответствии с техническим заданием и предпочтениями разработчика
ВВЕДЕНИЕ 5
1 ОБЗОР СОСТОЯНИЯ ВОПРОСА 7
2 ВЫБОР АППАРАТНЫХ СРЕДСТВ 8
3 ПРОГРАММИРОВАНИЕ И ОПИСАНИЕ АППАРАТНО-ПРОГРАММНОГО КОМПЛЕКСА 9
3.1 Структура комплекса 9
3.2 Описание модулей и их реализация 10
4 ТЕСТИРОВАНИЕ 16
ЗАКЛЮЧЕНИЕ 19
СПИСОК ЛИТЕРАТУРЫ 20
button_lia : IN std_logic;
button_si : IN std_logic;
dinamik : OUT std_logic );
END COMPONENT;
После чего устанавливаем связи данного компонента с сигналами объекта:
uut: Main PORT MAP (
clk_cnt => clk_cnt,
button_do => button_do,
button_re => button_re,
button_mi => button_mi,
button_fa => button_fa,
button_sol => button_sol,
button_lia => button_lia,
button_si => button_si,
dinamik => dinamik );
Далее идет описани епроцессов:
Процесс подающий тактовый сигнал:
clk_cnt_process :process
begin
clk_cnt <= '0';
wait for clk_cnt_period/2;
clk_cnt <= '1';
wait for clk_cnt_period/2;
end process;
Процесс симулирующий нажатие кнопки синтезатора:
Для выявления ошибок было проведено тестирование на компьютере со следующей конфигурацией:
Intel CoreDuo CPU T6400 2.0 GHz, ОС Windows 7 x64.
Для моделирования работы
системы использовался
Рисунок 4.1 – Временная диаграмма
Опишем действия, показанные на временной диаграмме.
В тестовом модуле задаётся тактовая частота (1МГц). Запуск тактового генератора показан на рисунке 4.2.
Рисунок 4.2 – Запуск тактового генератора
Симулируем нажатие кнопки, как показано на рисунке 4.3
Рисунок 4.3 – Нажатие кнопки
Выполняется подача сигнала на динамик, как показано на рисунке 4.4.
Рисунок 4.4 – Подача сигнала на динамик
Выполняется смена нажатии клавиши с ноты до на си, как показано на рисунке 4.5.
Рисунок 4.5 – Смена сигналов
После нажатия кнопки си, генерируется сигнал на динамик, как показано на рисунке 4.6
Рисунок 4.6 – Генерация сигнала на динамике
В ходе полного тестирования никаких ошибок выявлено не было. Все ожидаемые результаты подтвердились.
Разработанное приложение успешно прошло тестирование и полностью готово для эксплуатации.
Результатом выполненного курсового проекта является система «Музыкальный синтезатор».
Выполнение данного курсового проекта способствовало получению практических навыков в технологии разработки аппаратно-программных вычислительных систем, а также был приобретен опыт работы с языком программирования VHDL и средой разработки IntegratedSynthesisEnvironment (ISE).
Данная система
пригодна в использования для любого музыкального
синтезатора, который будет построен с
использованием соответствующей микросхемы.
Данная система не нуждается в кардинальном
изменении логики, единственным ее недостатком
является отсутствия одновременного нажатия
двух или более клавиш, что только тогда
повлечет в изменение логики программы.
1) Бибило Пётр Николаевич. Основы языка VHDL. Изд. 3-е, доп. – М.: Издательство ЛКИ, 2007. – 328с.
2) Максфилд К. Проектирование на ПЛИС. Курс молодого бойца. – М.: Издательский дом «Дзюдека-ХХ» , 2007. – 408с.
3) Сергиенко А. М. VHDL для проектирования вычислительных устройств, К.: ЧП «Корнейчук», ООО «ТИД «ДС»», 2003. – 208 с.
4) Интернет ресурс [http://www.abtronics.ru].
5) Интернет ресурс
[http://ru.wikipedia.org/wiki/
ЛИСТИНГ ПРОГРАММЫ
Модуль Main.vhd:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.ALL;
entity Main is
PORT ( clk_cnt, button_do, button_re, button_mi, button_fa, button_sol, button_lia, button_si : in STD_LOGIC;
dinamik: out STD_LOGIC );
end Main;
architecture Behavioral of Main is
component CLK_1MGz
PORT (clk: in std_logic;
clk_out: out std_logic);
end component;
component Music
PORT ( clk_cnt: in STD_LOGIC;
button_do, button_re, button_mi, button_fa, button_sol, button_lia, button_si : in STD_LOGIC;
dinamik: out STD_LOGIC );
end component;
signal s:std_logic;
begin
u:CLK_1MGz port map(clk=>clk_cnt,clk_out=>s);
u1:Music port map(clk_cnt=>clk_cnt, button_do=>button_do, button_re=>button_re, button_mi=>button_mi, button_fa=>button_fa, button_sol=>button_sol, button_lia=>button_lia, button_si=>button_si, dinamik=>dinamik);
end Behavioral;
Модуль Music.vhdl:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.ALL;
entity Music is
port(clk_cnt: in STD_LOGIC;
button_do: in STD_LOGIC := '0';
button_re: in STD_LOGIC := '0';
button_mi: in STD_LOGIC := '0';
button_fa: in STD_LOGIC := '0';
button_sol: in STD_LOGIC := '0';
button_lia: in STD_LOGIC := '0';
button_si: in STD_LOGIC := '0';
dinamik: out STD_LOGIC := '0');
end Music;
architecture Behavioral of Music is
begin
proc_state: process (clk_cnt,button_do, button_re, button_mi, button_fa, button_sol, button_lia, button_si)
variable count_Gz : integer range 0 to 3832;
begin
if (clk_cnt'event and clk_cnt='1' ) then
if (button_do='1') then
count_Gz := count_Gz + 1;
if (count_Gz<3850) then
dinamik <= '0';
end if;
if (count_Gz>=3850) then
dinamik <= '1';
if (count_Gz>5775) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if ( button_re='1') then
count_Gz := count_Gz + 1;
if (count_Gz<3412) then
dinamik <= '0';
end if;
if (count_Gz>=3412) then
dinamik <= '1';
if(count_Gz>5518) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if (button_mi='1') then
count_Gz := count_Gz + 1;
if (count_Gz<3039) then
dinamik <= '0';
end if;
if (count_Gz>=3039) then
dinamik <= '1';
if(count_Gz>4558) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if ( button_fa='1') then
count_Gz := count_Gz + 1;
if (count_Gz<2865) then
dinamik <= '0';
end if;
if (count_Gz>=2865) then
dinamik <= '1';
if(count_Gz>4297) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if ( button_sol='1') then
count_Gz := count_Gz + 1;
if (count_Gz<2551) then
dinamik <= '0';
end if;
if (count_Gz>=2551) then
dinamik <= '1';
if(count_Gz>3826) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if ( button_lia='1') then
count_Gz := count_Gz + 1;
if (count_Gz<2272) then
dinamik <= '0';
end if;
if (count_Gz>=2272) then
dinamik <= '1';
if(count_Gz>3404) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
if ( button_si='1') then
count_Gz := count_Gz + 1;
if (count_Gz<2028) then
dinamik <= '0';
end if;
if (count_Gz>=2028) then
dinamik <= '1';
if(count_Gz>3042) then
count_Gz:=0;
dinamik <= '0';
end if;
end if;
end if;
end if;
end process;
end Behavioral;
Модуль CLK_1MGz.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.ALL;
entity CLK_1MGz is
PORT (clk: in std_logic;
clk_out: out std_logic);
end CLK_1MGz;
architecture Behavioral of CLK_1MGz is
begin
process(clk)
variable cnt: integer range 0 to 1000;
begin
if (clk 'event and clk='1') then
if(cnt>=500) then
clk_out<='1';
else
clk_out<='0';
end if;
if(cnt=1000) then
cnt:=0;
else
cnt:=cnt+1;
end if;
end if;
end process;
end Behavioral;
Модуль test.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY test IS
END test;
ARCHITECTURE behavior OF test IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT Main
PORT(
clk_cnt : IN std_logic;
button_do : IN std_logic;
button_re : IN std_logic;
button_mi : IN std_logic;
button_fa : IN std_logic;
button_sol : IN std_logic;
button_lia : IN std_logic;
button_si : IN std_logic;
dinamik : OUT std_logic
);
END COMPONENT;
--Inputs
signal clk_cnt : std_logic := '0';
signal button_do : std_logic := '0';
signal button_re : std_logic := '0';
signal button_mi : std_logic := '0';
signal button_fa : std_logic := '0';
signal button_sol : std_logic := '0';
signal button_lia : std_logic := '0';
signal button_si : std_logic := '0';
--Outputs
signal dinamik : std_logic;
-- Clock period definitions
constant clk_cnt_period : time := 1000 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: Main PORT MAP (
clk_cnt => clk_cnt,
button_do => button_do,
button_re => button_re,
button_mi => button_mi,
button_fa => button_fa,
button_sol => button_sol,
button_lia => button_lia,
button_si => button_si,
dinamik => dinamik
);
-- Clock process definitions
clk_cnt_process :process
begin
clk_cnt <= '0';
wait for clk_cnt_period/2;
clk_cnt <= '1';
wait for clk_cnt_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
wait for 10 ms;
button_do<='1';
wait for 50 ms;
button_do<='0';
wait for 10 ms;
button_si<='1';
wait for 50 ms;
button_si<='0';
wait for 10 ms;
button_mi<='1';
wait for 50 ms;
button_mi<='0';
wait for 10 ms;
button_sol<='1';
wait for 50 ms;
button_sol<='0';
wait;
end process;
END;