Блог

Первый проект для 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:

 

cf0d5a46e64fe4680c486611e9d6067f.jpg

Выбираем New Project Wizard.

343f6e45aa84eb1a854afb74125c8d3f.jpg

 

Жмем Next

ac6d21b0faa43f60c5d93de31203f617.jpg

Выбираем путь и имя нашего проекта. У меня это "H:\projects\prj_fpga_altera\prj_VE-EP4CE10E\EP4CE10E\cyclone4_first" и "cyclone4_first" соответственно.

5f9c1c99fe4be6c3b8c432ca71592a32.jpg

Выбираем Empty project.

7d012e68d3a0c87ea18ee756f4822b86.jpg

Никаких файлов не добавляем.

6372d45b3ff83dd1173962862037ca54.jpg

Выбираем тип кристалла установленный на нашей плате. А именно EP4CE1022I7.

7cdfa80309285516a6eedc3740457e94.jpg

В качестве языка симуляции выбираем Verilog HDL.

d008fb0968efab021b8307cce324c0b8.jpg

Общая сводка по созданному проекту.

04b6bfa42a20f0324bc3148d2a988eb9.jpg

Все! Можно делать первый проект :)

4a4319f26652fc79727ece87361bfef1.jpg

Выбираем пункт меню File->New. Создаем Block Diagram/Schematic File. Это будет наш основной, так называемый Top-Level Entity. Для того чтобы сделать наш файл основным, выбираем пункт меню Project->Set as Top-Level Entity.

a082fca5b2527bf4413954bf8bbd7997.jpg

Через тот-же пункт меню создаем Verilog HDL File. Вставляем в этот файл следующий код:

Verilog Code:
  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 Гц. Поэтому я выбираю данные константы развертки:

1688a2cce16ede2aeff927fe0330ef8f.jpg

Далее нам нужно создать графическое представления нашего кода. Для этого выбираем пункт меню File->Create / Update->Create Symbol Files for Current Files. Далее создадим Привязку пинов чипа к именам, которые можно использовать в проекте. Для этого открываем Assigments->Assigment Editor, и вводим таблицу сопоставления:

571639a905ddbe6222939587a754dd9c.jpg

Теперь создадим функцию синтезатора частоты. Дело в том, что на плате установлен кварц номиналом 50 МГц. А для формирования изображения 1280*1024*75 Гц нам потребуется частота, равная (1280+248+144+16)*(1024+38+3+1)*75. Итого 134955600 Гц. Приступим:

89b9894d4367d5c9b887270dcd4dc47d.jpg

В IP Catalog выбираем Library->Basic Functions->Clocks; PLLs and Reset->PLL->ALTPLL.

d52ddee6cad3f90ea34c0d0b7da9f150.jpg

Выбираем язык Verilog. Путь к создаваемому модулю "H:\projects\prj_fpga_altera\prj_VE-EP4CE10E\EP4CE10E\cyclone4_first\pll0". Нажимаем OK.

1461500094810d642422cb7ea6e4bbd1.jpg

Выбираем частоту inclk0 равной 50 MHz. Нажимаем Next>.

08b2a08087cec246955e382b987c1c4e.jpg

Отменяем создание дополнительных входов и выходов управления.

9f43b1191ae6d30ea417134876ccfe32.jpg

Оставляем без изменений.

d4a0a07c2c545555173e9f7cb14a0828.jpg

Второй вход ФАПЧ оставляем незадействованным.

4fb92c886d39f7101dea51509c9d9c94.jpg

Динамическая реконфигурация нам пока не нужна :)

83b381384bcd58a476401d33c2cb0ab8.jpg

Вот мы и добрались до самой главной настройки. Для начала выбираем Enter output clock frequency. В поле Requested Settings вводим рассчитаную нами частоту: 134.955600. Далее нажимаем кнопку <<Copy. Quartus подобрал нам значения коэффициентов 27 и 10. Проверяем (50*27)/10=135 МГц. Нажимаем Next>>.

5c924f2d12842001ce1748f72a084290.jpg

Наимаем Next>>.

fc6de1168f92de5e4efb2d39ddb6c788.jpg

Ставим галку в чикбоксе pll0.bsf Quartus II symbol file. Этим мы создадим символ нашего ФАПЧ.

9ca953373b0ea9adffe3a4f293ad28b6.jpg

Тут Quartus спрашивает необходимо ли добавить сгенерированный модуль в наш проект. Нажимаем Yes.

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

6290f235dd4e3b83df506399293da1ce.jpg

Созаем схему:

98da3ee68c768409c6052262a67248e5.jpg

Выбираем пункт меню Processing->Start Compilation. Если все сделанно правильно, мы увидим результат:

88e4c29d8ffae985896a8d82d444af7b.jpg

Осталось загрузить наш проект в отладочную плату VE-EP4CE10E! Выбираем Tools->Programmer:

94d6db178640fefd5ea45443851f4db5.jpg

Добавляем наш файл "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 мониторе наблюдаем следующую картину:

53eb4f18df778116c0fac4e05c083e72.jpg

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

Verilog Code:
  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

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

2d32bde4a6cd4d0908fb9066781a9e2a.jpg

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