Музыкальный синтезатор

 

 

 

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ 5

1 ОБЗОР СОСТОЯНИЯ  ВОПРОСА 7

2 ВЫБОР АППАРАТНЫХ  СРЕДСТВ 8

3 ПРОГРАММИРОВАНИЕ  И ОПИСАНИЕ АППАРАТНО-ПРОГРАММНОГО  КОМПЛЕКСА 9

3.1 Структура  комплекса 9

3.2 Описание  модулей и их реализация 10

4 ТЕСТИРОВАНИЕ 16

ЗАКЛЮЧЕНИЕ 19

СПИСОК ЛИТЕРАТУРЫ 20

ПРИЛОЖЕНИЕ  А 21

 

 

 

ВВЕДЕНИЕ

 

Современный этап развития цифровой техники характеризуется  широким 

применением программно-аппаратных комплексов, которые строятся по принципу «система на кристалле». При этом в  качестве элементной базы для реализации таких систем все чаще используются программируемые логические интегральные схемы (ПЛИС)

ПЛИС позволяют реализовать  в своем составе практически  любое цифровое устройство от простейших триггеров до цифровых фильтров. процессоров, контроллеров и синтезаторов. Микросхемы ПЛИС хороши тем, что позволяют перепрограммировать  себя в системе, то есть уже запаянными на печатную плату. Так же они обладают десятками и сотнями выводов, 94 % из которых — перепрограммируемые  пользователем двунаправленные  выводы. Это значит, что на любом  этапе создания цифрового устройства можете переназначить вывод под  другую функцию либо вообще исключить  из проекта. 

В настоящее время наиболее распространенные серии ПЛИС имеют 

следующую архитектуру:

  • CPLB (Complex Programmable Logic Device), устройства, использующие для хранения конфигурации энергонезависимую память;
  • FPGA (Field Programmable Gate Array), устройства, использующие для хранения конфигурации энергозависимую память, которая требует инициализации после включения питания .

ПЛИС  CPLD относятся к  устройствам начального уровня и  предназначены для реализации устройств небольшого логического объема.

По сравнению с архитектурой  CPLD, ПЛИС  FPGA содержат намного большее число меньших по размерам отдельных логических блоков и имеют развитую распределенную структуру внутренних соединений, которая занимает почти весь кристалл . Помимо большего объема логических ресурсов, современные ПЛИС  FPGA отличаются наличием аппаратно выделенных ресурсов для решения типичных задач цифровой обработки сигналов и используются для построения более сложных устройств.

Целью курсовой работы является разработать проект “Музыкальный синтезатор” используя ПЛИС фирмы Xilinx в среде проектирования XilinxISE.

Для программирования логики работы синтезатора  использовался язык  VHDL ((Very high speed integrated circuits) Hardware Description Language).

Язык VHDL - это международный стандарт в области автоматизации проектирования цифровых систем.Средствами языка VHDL возможно проектирование на различных уровнях абстракции (поведенческом или алгоритмическом, регистровых передач, структурном), в соответствии с техническим заданием и предпочтениями разработчика. Заложена возможность иерархического проектирования, максимально реализующая себя в экстремально больших проектах с участием большой группы разработчиков. Представляется возможным выделить следующие три составные части языка: алгоритмическую — основанную на языках Ada и Pascal и придающую языку VHDL свойства языков программирования; проблемно ориентированную — в сущности и обращающую VHDL в язык описания аппаратуры; и объектно-ориентированную, интенсивно развиваемую в последнее время.

VHDL является входным языком многих современных систем автоматизированного проектирования (САПР), программируемых логических интегральных схем.VHDL предназначен для точного описания проектируемых систем и их моделирования на начальных этапах проектирования.

 

 

1 ОБЗОР СОСТОЯНИЯ ВОПРОСА

 

Музыкальный синтезатор  — музыкальный  инструмент синтезирующий звук при помощи одного или нескольких генераторов звуковых волн.

Выход звукового сигнала достигается за счёт изменения свойств электрического сигнала (в аналоговых синтезаторах) или же методом настройки параметров центрального процессора (в цифровых синтезаторах). Синтезатор, выполненный в виде корпуса с клавиатурой, называется клавишным синтезатором. В случае, если клавишный синтезатор оборудован встроенным секвенсором, он называется рабочей станцией. Синтезатор в виде компьютерной программы, использующей универсальную звуковую плату для озвучивания и стандартные средства ввода-вывода (компьютерные клавиатуру, мышь, монитор, а также, возможно, MIDI-клавиатуру), называется программным синтезатором.

В ходе курсового проекта  был разработан простейший музыкальный синтезатор  оборудованный семью входами, каждый из который соответствует определенной ноте и одним выходом который подключен к динамику. 

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

Целью курсового проекта является разработка АПВС для осуществления  работы музыкального синтезатора. 

Исходные данные проекта:

  • при нажатии на клавишу генерируется сигнал с частотой соответствующей музыкальной ноте;
  • частота тактового сигнала 1 МГц.

 

 

 

 

2 ВЫБОР АППАРАТНЫХ  СРЕДСТВ

 

Для реализации поставленной задачи была выбрана ПЛИС EPM1270F256I5N семейства  MAX® II CPLDs. ПЛИС серии MAX® II содержат от 240 до 2210 логических элементов и от 128 до 2210 макроэлементов, а также имеют энергонезависимую память с минимальным объемом 8Кбит. Устройства серии MAX® II обеспечивают высокую производительность и надежную работу в сравнении с другими архитектурами CPLD.

Основой CPLD является матрица  макроячеек, в которой реализованы  логические соединения вентилей или  более сложные логические операции. Блоки макроячеек объединены программируемой  коммутационной матрицей с последующим  выходом на входы (выходы) схемы.

Особенности:

  1. Низкая стоимость,CPLD малой мощности;
  2. Мгновенное действие,энергонезависимая архитектура;
  3. Ток в режиме ожидания до 25мкА;
  4. Быстрая задержка распространения;
  5. UFM блок до 8Кбит для долговременного хранения данных;
  6. Мультивольтовое ядро, позволяющее питать устройство от 3.3V/2.5V или 1.8V;
  7. поддержка мультивольтового интерфейса ввода/вывода рассчитанного на логические уровни 3.3V, 2.5V, 1.8V и 1.5V;
  8. Триггеры Шмитта позволяют ограничить уровень входного шума;
  9. Входы/выходы полностью соответствуют периферийным компонентам;
  10. ISP схема соответствует стандарту IEEE Std. 1532.

В таблице 1 приведены основные характеристики ПЛИС EPM1270F256I5N.

 

 

Наименование

 

Тип памяти

 

Частота

 

Число макроячеек

Число вводов/

выводов

Количество логических блоков/ элементов

EPM1270F256I5N

FLASH

1.8797GHz

980

212

1270


 

Таблица 1 – Основные характеристики ПЛИС EPM1270F256I5N.

3 ПРОГРАММИРОВАНИЕ  И ОПИСАНИЕ АППАРАТНО-ПРОГРАММНОГО КОМПЛЕКСА

3.1 Структура комплекса

 

Созданный проект состоит  из четырех модулей, как показано на рисунке 3.1:

  1. Main.vhd — главный модуль;
  2. CLK_1MGz.vhd — модуль тактового генератора;
  3. Music.vhd — модуль синтеза нот;
  4. test.vhd— тестовый модуль.

 

 

Рисунок 3.1– Модули проекта

Упрощенная структурная схема разработанной системы представлена на рисунке 3.2.

Рисунок 3.2 – Упрощенная структурная схема

3.2 Описание модулей и  их реализация

 

Главным модулем приложения является Main. Описание объекта моделирования:

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;

Назначение сигналов:

    • clk_cnt – тактовый сигнал;
    • button_do –кнопка синтеза ноты до;
    • button_re – кнопка синтеза ноты ре;
    • button_mi – кнопка синтеза ноты ми;
    • button_fa – кнопка синтеза ноты фа;
    • button_sol – кнопка синтеза ноты соль;    
    • button_lia – кнопка синтеза ноты ля;
    • button_si – кнопка синтеза ноты си;
    • dinamik – динамик для воспроизведения звука.

Далее идет описание модуля 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;

В модуле CLK_1MGz создается тактовый генератор с частотой 1МГц:

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;

Тестовый модуль — Test. Сначала декларируется тестируемый компонент:

  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;

После чего устанавливаем связи данного компонента с сигналами объекта:

   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;

Процесс симулирующий нажатие  кнопки синтезатора:

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;

 

4 ТЕСТИРОВАНИЕ

 

Для выявления ошибок было проведено тестирование на компьютере со следующей конфигурацией:

Intel CoreDuo CPU T6400 2.0 GHz, ОС Windows 7 x64.

Для моделирования работы системы использовался симулятор  ISimSimulator, входящий в состав XilinxISE. Была получена временная диаграмма, представленнаяна рисунке 4.1

 

 

Рисунок 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/VHDL].

 

 

 

ПРИЛОЖЕНИЕ А

 

ЛИСТИНГ ПРОГРАММЫ

 

Модуль 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;

 


Музыкальный синтезатор