Корзина

0 Товары - 0.00 RUB
В корзину

Курсы Валют

Курсы Валют  Дата ЦБ
Нал.USD
24.11 58.46
Нал.EUR
24.11 69.18
Нал.CNY
24.11 88.80

Оплата

visa

Реклама

Блог

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

Теперь, когда наш контроллер умеет управлять выводом по командам, поступающим по USB. Мы можем создать проект где микроконтроллер и плис будут взаимодействовать. Сам процесс создания проекта для плис я опущу, он подробно описан в нашей статье Первый проект для VE-EP4CE10E. Часть 2.. Расскажу только об используемых модулях. Схема проекта представлена ниже:

 

 b42914f55472ef6616524c6c164c0fc4.jpg

Отдельно стоит обратить внимание на новый модуль ROM: 1-PORT. Создать его можно, вызвав IP Catalog->Installed IP->Library->Basic Functions->On Chip Memory->ROM: 1-PORT

2bff16c542cff55e5ae86308d2cb62ad.jpg

На этой вкладке настраиваем тип памяти: 8 bits 32768 words. Остальное оставляем без изменений.

ada0b5fa1aa89215de6bb95d90396c6a.jpg

В этом месте можно настроить защелку на выходе шины данных, вход асинхронного сброса, сигнал разрешения чтения. Нам этого не надо.

78419df920103bd6d30828485908a8f8.jpg

На этом этапе нужно выбрать файл который будет содержаться в нашей памяти. В качестве исходного файла берем любой BMP файл размером меньше 32768 байт. В Quartus можно загрузить файлы типа hex. Поэтому конвертируем файл BMP в HEX. Для этого автор использовал утилиту J-Flash из стандартного набора отладчика SEGGER J-Link. Для того чтобы J-Link смог открыть нашу картинку, меняем расширение с BMP на BIN. Стартовый адрес указываем 0.

5106212c624a63b86656eb032ba734f3.jpg

Нажимаем Next.

c57fda3d1fa982f845927ebe08166be3.jpg

Выбираем пункт Quartus II symbol file. Это приведет к созданию символа для вставки в нашу схему. Теперь приступим к созданию кода:

Verilog Code:
  1. module hvsync_ex(
  2. // inputs:
  3. input wire char_clock,
  4.  
  5. input wire [3:0]red_in,
  6. input wire [3:0]green_in,
  7. input wire [3:0]blue_in,
  8.  
  9. // outputs:
  10. output reg [11:0]char_count_, //post reg
  11. output reg [11:0]line_count_, //post reg
  12.  
  13. output wire [3:0]red,
  14. output wire [3:0]green,
  15. output wire [3:0]blue,
  16.  
  17. output reg hsync,
  18. output reg vsync,
  19. output reg blank
  20. );
  21.  
  22. //VGA Standart
  23. `define h_visible_area 1024
  24. `define h_front_porch 24
  25. `define h_sync_pulse 136
  26. `define h_back_porch 160
  27.  
  28. `define v_visible_area 768
  29. `define v_front_porch 3
  30. `define v_sync_pulse 6
  31. `define v_back_porch 29
  32.  
  33. //variables
  34. reg [11:0]char_count;
  35. reg [1:0]pixel_state;
  36. reg [11:0]line_count;
  37. reg [1:0]line_state;
  38.  
  39. reg end_of_line;
  40. reg end_of_frame;
  41.  
  42. //permanent comb computations:
  43. always @*
  44. begin
  45. //horizontal processing
  46. if(char_count < `h_visible_area)
  47. pixel_state = 0; //active video
  48. else
  49. if(char_count < `h_visible_area + `h_front_porch)
  50. pixel_state = 1; //front porch
  51. else
  52. if(char_count < `h_visible_area + `h_front_porch + `h_sync_pulse)
  53. pixel_state = 2; //hsync impuls
  54. else
  55. pixel_state = 3; //back porch
  56.  
  57. if(char_count < `h_visible_area + `h_front_porch + `h_sync_pulse + `h_back_porch)
  58. end_of_line = 0;
  59. else
  60. end_of_line = 1;
  61.  
  62. //vert processing
  63. if(line_count < `v_visible_area)
  64. line_state = 0; //active video lines
  65. else
  66. if(line_count < `v_visible_area + `v_front_porch)
  67. line_state = 1; //front porch
  68. else
  69. if(line_count < `v_visible_area + `v_front_porch + `v_sync_pulse)
  70. line_state = 2; //vsync impuls
  71. else
  72. line_state = 3; //front porch
  73.  
  74. if(line_count < `v_visible_area + `v_front_porch + `v_sync_pulse + `v_back_porch)
  75. end_of_frame = 0;
  76. else
  77. end_of_frame = 1;
  78. end
  79.  
  80. //synchronous process
  81. always @(posedge char_clock)
  82. begin
  83. hsync <= (pixel_state!=2'b10);
  84. vsync <= (line_state!=2'b10);
  85. blank <= (pixel_state==2'b0 && line_state==2'b0);
  86.  
  87. //char_count_ <= char_count;
  88. line_count_ <= line_count;
  89.  
  90. if(end_of_line)
  91. begin
  92. char_count <= 0;
  93. char_count_ <= 0;
  94.  
  95. if(end_of_frame)
  96. line_count <= 0;
  97. else
  98. line_count <= line_count + 1'b1;
  99. end
  100. else
  101. begin
  102. char_count <= char_count + 1'b1;
  103. if (pixel_state==2'b0)
  104. char_count_ <= char_count_ + 1'b1;
  105. end
  106. end
  107.  
  108. assign red = red_in;
  109. assign green = green_in;
  110. assign blue = blue_in;
  111.  
  112. endmodule

Модуль hvsync_ex генерирует VGA развертку и положение точки на экране (char_count_, line_count_). Следующий код:

 

Verilog Code:
  1. module picture_gen(
  2.  
  3. //vga
  4. input [11:0]char_count,
  5. input [11:0]line_count,
  6. input wire mcu_data0,
  7. input wire blank,
  8. input wire char_clock,
  9.  
  10. output reg [3:0]red_out,
  11. output reg [3:0]green_out,
  12. output reg [3:0]blue_out,
  13.  
  14. //sram memory
  15. inout [7:0]data, // SRAM Data Bus
  16. output reg [18:0]adress, // SRAM Address
  17. output reg cs, // SRAM Chip Select
  18. output reg we, // SRAM Write Enable
  19. output reg oe, // SRAM Output Enable
  20.  
  21. //built-in memory
  22. input [7:0]bmp_data,
  23. output reg[14:0]bmp_adress
  24.  
  25. );
  26.  
  27. reg r_w=0;
  28. reg [7:0]out_data;
  29. reg [7:0]palit_adr;
  30. reg [3:0]r_state = state0;
  31. reg [11:0]x_cnt=0;
  32. reg [11:0]y_cnt=0;
  33. reg [7:0]R;
  34. reg [7:0]G;
  35. reg [7:0]B;
  36. reg [9:0]delay;
  37.  
  38. localparam
  39. state0 = 4'b0001,
  40. state1 = 4'b0010,
  41. state2 = 4'b0011,
  42. state3 = 4'b0100,
  43. state4 = 4'b0101,
  44. state5 = 4'b0110,
  45. state6 = 4'b0111,
  46. state7 = 4'b1000,
  47. state8 = 4'b1001,
  48. state9 = 4'b1010;
  49.  
  50. assign data = r_w ? 8'bzzzzzzzz : out_data; //tristate sram data bus
  51.  
  52. //sram in/out
  53. always @(posedge char_clock)
  54. begin
  55. if (blank)
  56. begin
  57. if(r_w==1) //read sram to VGA
  58. begin
  59. if(r_state == state0)
  60. begin
  61. cs <=1'b0;
  62. we <=1'b1;
  63. adress <= ((line_count>>1)*512 | char_count>>1);
  64. oe <=1'b0;
  65. r_state <= state1;
  66. end
  67. else if(r_state == state1)
  68. begin
  69. if(mcu_data0==0)
  70. begin
  71. red_out <= (data >> 4) & 8'b00001110;
  72. green_out <= (data >> 1) & 8'b00001100;
  73. blue_out <= (data<<1) & 8'b00001110;
  74. end
  75. else
  76. begin
  77. red_out <= 0;
  78. green_out <= 0;
  79. blue_out <= 0;
  80. end
  81. oe <=1'b1;
  82. r_state <= state0;
  83. end
  84. end
  85. else //write sram
  86. begin
  87. delay <= delay+1;
  88. if(delay>1)
  89. begin
  90. delay <= 0;
  91. if(r_state == state0)
  92. begin
  93. cs <= 1'b0;
  94. oe <= 1'b1;
  95. we <= 1'b1;
  96. adress <= (y_cnt*512 + x_cnt);
  97. if(x_cnt <= 246 && y_cnt <= 89)
  98. begin
  99. bmp_adress<=(y_cnt*248+x_cnt+1078);
  100. end
  101. r_state <= state1;
  102. end
  103.  
  104. else if(r_state == state1)
  105. begin
  106. if(x_cnt <= 246 && y_cnt <= 89)
  107. begin
  108. palit_adr <= bmp_data;
  109. end
  110. else
  111. begin
  112. palit_adr <= 0;
  113. end
  114. r_state <= state2;
  115. end
  116. else if(r_state == state2)
  117. begin
  118. bmp_adress <= (palit_adr*4+54);
  119. r_state <= state3;
  120. end
  121. else if(r_state == state3)
  122. begin
  123. B <= bmp_data;
  124. bmp_adress <= (palit_adr*4+55);
  125. r_state <= state4;
  126. end
  127. else if(r_state == state4)
  128. begin
  129. G <= bmp_data;
  130. bmp_adress <= (palit_adr*4+56);
  131. r_state <= state5;
  132. end
  133. else if(r_state == state5)
  134. begin
  135. R <= bmp_data;
  136. r_state <= state6;
  137. end
  138.  
  139. else if(r_state == state6)
  140. begin
  141. out_data <= (R & 8'b11100000) | (G>>3 & 8'b00011000) | (B>>5 & 8'b00000111);
  142. x_cnt <= x_cnt+1;
  143. r_state <= state7;
  144. end
  145.  
  146. else if(r_state == state7)
  147. begin
  148. we <=1'b0;
  149. if(x_cnt >= 512)
  150. begin
  151. x_cnt <= 0;
  152. y_cnt <= y_cnt+1;
  153. end
  154. if(y_cnt >= 384)
  155. begin
  156. y_cnt <= 0;
  157. end
  158. if((y_cnt*512 + x_cnt)==196608)
  159. begin
  160. ino<=1;
  161. end
  162. r_state <= state0;
  163. end
  164. end
  165. end
  166. end
  167. else
  168. begin
  169. red_out <= 0;
  170. green_out <= 0;
  171. blue_out <= 0;
  172. end
  173. end
  174.  
  175. endmodule

Сначала копирует наш BMP файл из встроенной памяти во внешнюю SRAM. Причем делает это с учетом палитры 8 битного BMP файла. Затем выводит содержимое памяти на монитор, учитывая состояние входа mcu_data0. Если на входе логический 0, то выводится содержимое внешней памяти, если логическая 1 то черный экран.

Назначение выводов:

a6e62ed9b09dd28f5d4cc29f677f9cc2.jpg

Ну и в завершение скриншот:

Результат

 Архив проекта: test_hardware.zip

Перевод

Вход

Или классический вход:

Время

Карта сайта Визуальная электроника