Как и обещал рассказываю о создании тестового проекта, для проверки ПЛИС EP4CE10E. Для начала нам нужно установить интегрированную среду разработки встроенного программного обеспечения для ПЛИС Altera Quartus II. Для этого переходим на сайт Altera по ссылке https://www.altera.com/downloads/download-center.html. Выбираем для скачивания Quartus II Web Edition. На странице необходимо будет выбрать версию Quartus II поддерживающую нашу FPGA Cyclone IV E. По правилам Altera скачивание возможно только после регистрации. В принципе ничего сложного там нет. Поэтому будем считать что Quartus II Вы скачали. Запускаем Quartus II:
Выбираем New Project Wizard.
Жмем Next
Выбираем путь и имя нашего проекта. У меня это "H:\projects\prj_fpga_altera\prj_VE-EP4CE10E\EP4CE10E\cyclone4_first" и "cyclone4_first" соответственно.
Выбираем Empty project.
Никаких файлов не добавляем.
Выбираем тип кристалла установленный на нашей плате. А именно EP4CE1022I7.
В качестве языка симуляции выбираем Verilog HDL.
Общая сводка по созданному проекту.
Все! Можно делать первый проект :)
Выбираем пункт меню File->New. Создаем Block Diagram/Schematic File. Это будет наш основной, так называемый Top-Level Entity. Для того чтобы сделать наш файл основным, выбираем пункт меню Project->Set as Top-Level Entity.
Через тот-же пункт меню создаем Verilog HDL File. Вставляем в этот файл следующий код:
Verilog Code:
/////////////////////////////////////////////////////////////// //module which generates video sync impulses /////////////////////////////////////////////////////////////// module hvsync ( // inputs: input wire pixel_clock, // outputs: output reg hsync, output reg vsync, //high-color test video signal output reg [3:0]r, output reg [3:0]g, output reg [3:0]b ); // video signal parameters, default 1280x1024 75Hz (134955600 Hz pixelclock) parameter horz_front_porch = 16; //H Front Porch = 0.119; (usec) = 2 chars = 16 Pixels parameter horz_sync = 144; //Hor Sync Time = 1.067; (usec) = 18 chars = 144 Pixels parameter horz_back_porch = 248; //H Back Porch = 1.837; (usec) = 31 chars = 248 Pixels parameter horz_addr_time = 1280; parameter vert_front_porch = 1; //V Front Porch = 0.013; (msec) = 1 lines parameter vert_sync = 3; //Ver Sync Time = 0.038; (msec) = 3 lines parameter vert_back_porch = 38; //V Back Porch = 0.475; (msec) = 38 lines parameter vert_addr_time = 1024; //variables reg [11:0]pixel_count = 0; reg [11:0]line_count = 0; reg hvisible = 1'b0; reg vvisible = 1'b0; //synchronous process always @(posedge pixel_clock) //горизонтальные синхроимпульсы begin hsync <= (pixel_count < horz_sync); hvisible <= (pixel_count >= (horz_sync+horz_back_porch)) && (pixel_count < (horz_sync+horz_back_porch+horz_addr_time)); if(pixel_count < (horz_sync+horz_back_porch+horz_addr_time+horz_front_porch) ) pixel_count <= pixel_count + 1'b1; else pixel_count <= 0; end always @(posedge hsync) //вертикальные синхроимпульсы begin vsync <= (line_count < vert_sync); vvisible <= (line_count >= (vert_sync+vert_back_porch)) && (line_count < (vert_sync+vert_back_porch+vert_addr_time)); if(line_count < (vert_sync+vert_back_porch+vert_addr_time+vert_front_porch) ) line_count <= line_count + 1'b1; else line_count <= 0; end wire visible; assign visible = hvisible & vvisible; wire rvisible; assign rvisible = pixel_count[6]; wire gvisible; assign gvisible = pixel_count[7]; wire bvisible; assign bvisible = pixel_count[8]; always @* //Генерация цветных полос begin if(visible & rvisible) r = pixel_count[5:2]; else r = 0; if(visible & gvisible) g = pixel_count[5:2]; else g = 0; if(visible & bvisible) b = pixel_count[5:2]; else b = 0; end endmodule
Параметры развертки взяты из файла DMTv1r11.pdf.
Мой монитор имеет максимальное разрешение: 1280*1024 и частоту кадровой развертки: 75 Гц. Поэтому я выбираю данные константы развертки:Далее нам нужно создать графическое представления нашего кода. Для этого выбираем пункт меню File->Create / Update->Create Symbol Files for Current Files. Далее создадим Привязку пинов чипа к именам, которые можно использовать в проекте. Для этого открываем Assigments->Assigment Editor, и вводим таблицу сопоставления:
Теперь создадим функцию синтезатора частоты. Дело в том, что на плате установлен кварц номиналом 50 МГц. А для формирования изображения 1280*1024*75 Гц нам потребуется частота, равная (1280+248+144+16)*(1024+38+3+1)*75. Итого 134955600 Гц. Приступим:
В IP Catalog выбираем Library->Basic Functions->Clocks; PLLs and Reset->PLL->ALTPLL.
Выбираем язык Verilog. Путь к создаваемому модулю "H:\projects\prj_fpga_altera\prj_VE-EP4CE10E\EP4CE10E\cyclone4_first\pll0". Нажимаем OK.
Выбираем частоту inclk0 равной 50 MHz. Нажимаем Next>.
Отменяем создание дополнительных входов и выходов управления.
Оставляем без изменений.
Второй вход ФАПЧ оставляем незадействованным.
Динамическая реконфигурация нам пока не нужна :)
Вот мы и добрались до самой главной настройки. Для начала выбираем Enter output clock frequency. В поле Requested Settings вводим рассчитаную нами частоту: 134.955600. Далее нажимаем кнопку <<Copy. Quartus подобрал нам значения коэффициентов 27 и 10. Проверяем (50*27)/10=135 МГц.
Нажимаем Next>>.
Наимаем Next>>.
Ставим галку в чикбоксе pll0.bsf Quartus II symbol file. Этим мы создадим символ нашего ФАПЧ.
Тут Quartus спрашивает необходимо ли добавить сгенерированный модуль в наш проект. Нажимаем Yes.
Приступаем к созданию нашей схемы. Выбираем вкладку с файлом схематического ввода, и с помощью панели инструментов:
Созаем схему:
Выбираем пункт меню Processing->Start Compilation. Если все сделанно правильно, мы увидим результат:
Осталось загрузить наш проект в отладочную плату VE-EP4CE10E! Выбираем Tools->Programmer:
Добавляем наш файл "cyclone4_first\output_files\cyclone4_first.sof" с помощью кнопки Add File... Чтобы каждый раз не добавлять файл конфигурации ПЛИС, сохраним настройки: File->Save As... Выбираем имя файла "H:\projects\prj_fpga_altera\prj_VE-EP4CE10E\EP4CE10E\cyclone4_first\cyclone4_first.cdf. Нажимаем Сохранить. Подключаем Altera USB Blaster к разъему P2 нашей платы. Осталось нажать заветную кнопку Start! На подключенном VGA мониторе наблюдаем следующую картину:
Если немного изменить код генератора картинки:
Verilog Code:
always @* //Генерация xor текстуры begin if (hvisible & vvisible) begin r = (pixel_count ^ line_count) >> 6; g = (pixel_count ^ line_count) >> 4; b = (pixel_count ^ line_count) >> 2; end else begin r = 0; g = 0; b = 0; end end
Можно получить забавную картинку:
Файлы проекта: cyclone4_first.zip