Первый проект для VE-EP4CE10E. Часть 2.

Как и обещал рассказываю о создании тестового проекта, для проверки ПЛИС 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. Вставляем в этот файл следующий код:

  1. ///////////////////////////////////////////////////////////////
  2. //module which generates video sync impulses
  3. ///////////////////////////////////////////////////////////////
  4.  
  5. module hvsync (
  6. // inputs:
  7. input wire pixel_clock,
  8.  
  9. // outputs:
  10. output reg hsync,
  11. output reg vsync,
  12.  
  13. //high-color test video signal
  14. output reg [3:0]r,
  15. output reg [3:0]g,
  16. output reg [3:0]b
  17. );
  18.  
  19. // video signal parameters, default 1280x1024 75Hz (134955600 Hz pixelclock)
  20. parameter horz_front_porch = 16; //H Front Porch = 0.119; (usec) = 2 chars = 16 Pixels
  21. parameter horz_sync = 144; //Hor Sync Time = 1.067; (usec) = 18 chars = 144 Pixels
  22. parameter horz_back_porch = 248; //H Back Porch = 1.837; (usec) = 31 chars = 248 Pixels
  23. parameter horz_addr_time = 1280;
  24.  
  25. parameter vert_front_porch = 1; //V Front Porch = 0.013; (msec) = 1 lines
  26. parameter vert_sync = 3; //Ver Sync Time = 0.038; (msec) = 3 lines
  27. parameter vert_back_porch = 38; //V Back Porch = 0.475; (msec) = 38 lines
  28. parameter vert_addr_time = 1024;
  29. //variables
  30. reg [11:0]pixel_count = 0;
  31. reg [11:0]line_count = 0;
  32.  
  33. reg hvisible = 1'b0;
  34. reg vvisible = 1'b0;
  35.  
  36. //synchronous process
  37. always @(posedge pixel_clock) //горизонтальные синхроимпульсы
  38. begin
  39. hsync <= (pixel_count < horz_sync);
  40. hvisible <= (pixel_count >= (horz_sync+horz_back_porch)) &&
  41. (pixel_count < (horz_sync+horz_back_porch+horz_addr_time));
  42.  
  43. if(pixel_count < (horz_sync+horz_back_porch+horz_addr_time+horz_front_porch) )
  44. pixel_count <= pixel_count + 1'b1;
  45. else
  46. pixel_count <= 0;
  47. end
  48.  
  49. always @(posedge hsync) //вертикальные синхроимпульсы
  50. begin
  51. vsync <= (line_count < vert_sync);
  52. vvisible <= (line_count >= (vert_sync+vert_back_porch)) &&
  53. (line_count < (vert_sync+vert_back_porch+vert_addr_time));
  54.  
  55. if(line_count < (vert_sync+vert_back_porch+vert_addr_time+vert_front_porch) )
  56. line_count <= line_count + 1'b1;
  57. else
  58. line_count <= 0;
  59. end
  60.  
  61. wire visible; assign visible = hvisible & vvisible;
  62. wire rvisible; assign rvisible = pixel_count[6];
  63. wire gvisible; assign gvisible = pixel_count[7];
  64. wire bvisible; assign bvisible = pixel_count[8];
  65.  
  66. always @* //Генерация цветных полос
  67. begin
  68. if(visible & rvisible)
  69. r = pixel_count[5:2];
  70. else
  71. r = 0;
  72. if(visible & gvisible)
  73. g = pixel_count[5:2];
  74. else
  75. g = 0;
  76. if(visible & bvisible)
  77. b = pixel_count[5:2];
  78. else
  79. b = 0;
  80. end
  81.  
  82. 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 мониторе наблюдаем следующую картину:

Если немного изменить код генератора картинки:

  1. always @* //Генерация xor текстуры
  2. begin
  3. if (hvisible & vvisible)
  4. begin
  5. r = (pixel_count ^ line_count) >> 6;
  6. g = (pixel_count ^ line_count) >> 4;
  7. b = (pixel_count ^ line_count) >> 2;
  8. end
  9. else begin
  10. r = 0;
  11. g = 0;
  12. b = 0;
  13. end
  14. end

Можно получить забавную картинку:

Файлы проекта: cyclone4_first.zip