shield 3x7seg onboard FPGA

Сделали новую плату расширения для наших плат. Шилд дает новые возможности отображения информации для плат Марсоход2 / Марсоход2bis и плат Марсоход3 / Марсоход3bis. Он позволяет отображать 4 символа на семисегментном индикаторе с динамическим управлением. Так же добавляются четыре пользовательских кнопочки.

Дальше есть небольшое описание FPGA проекта, который демонстрирует работу этой платы расширения.

Проет не сложный. Его можно взять или посмотреть на github: https://github.com/marsohod4you/marsohod2bis/tree/master/segments_4x7

Я подготовил два варианта модуля семисегментного индикатора. Первый модуль seg4x7 позволяет просто отображать 4 шестнадцатиричные цифры: 0123456789ABCDEF..

Второй модуль чуть хитрее, он должен отображать 4 буквенных символа английского алфавита из ASCII таблицы. Конечно, далеко не все символы можно отображать, но большинство символов вполне узнаваемы. Идею я подсмотрел вот здесь: https://www.partsnotincluded.com/electronics/segmented-led-display-ascii-library/

7 Segment ASCII All

Я реализовал только некоторые буквы из вот этой таблицы, да и то, некоторые сделал немного по другому, а некоторые не делал вообще. Мною не реализованы буквы K, M, V, X... Вместо этих букв будет показываться знак "-".

Модуль на Verilog HDL будет выглядеть вот так:


module seg4x7_ascii(
  input wire clk, // 100MHZ
  input wire [31:0] in,
  output reg [3:0] digit_sel,
  output reg [7:0] out
);

reg [19:0] cnt;

always @ (posedge clk)
  cnt <= cnt +1'b1;

wire [1:0]digit_idx; assign digit_idx = cnt[19:18];
always @ (posedge clk)
  digit_sel <= 4'b0001 << digit_idx;

wire [7:0]a;
assign a = digit_sel[0] ? in[7:0] :
           digit_sel[1] ? in[15:8] :
           digit_sel[2] ? in[23:16]: in[31:24];

//bit number..
// +--6--+
// |     |
// 5     7
// |     |
// +--3--+
// |     |
// 0     4
// |     |
// +--2--+ (1)

always @ (posedge clk)
  case(a)
    // bAfCgD.e
    8'h20:out <= 8'b11111111;//space
    8'h2E:out <= 8'b11111101;//.
    8'h30:out <= 8'b00001010;//0
    8'h31:out <= 8'b01101111;//1
    8'h32:out <= 8'b00110010;//2
    8'h33:out <= 8'b00100011;//3
    8'h34:out <= 8'b01000111;//4
    8'h35:out <= 8'b10000011;//5
    8'h36:out <= 8'b10000010;//6
    8'h37:out <= 8'b00101111;//7
    8'h38:out <= 8'b00000010;//8
    8'h39:out <= 8'b00000011;//9

    8'h41:out <= 8'b00000110;//A
    8'h42:out <= 8'b11000010;//B
    8'h43:out <= 8'b10011010;//C
    8'h44:out <= 8'b01100010;//D
    8'h45:out <= 8'b10010010;//E
    8'h46:out <= 8'b10010110;//F
    8'h47:out <= 8'b10001010;//G
    8'h48:out <= 8'b01000110;//H

    8'h49:out <= 8'b11011110;//I
    8'h4A:out <= 8'b01101011;//J
    8'h4B:out <= 8'b11110111;//K -
    8'h4C:out <= 8'b11011010;//L
    8'h4D:out <= 8'b11110111;//M -
    8'h4E:out <= 8'b11100110;//N
    8'h4F:out <= 8'b11100010;//O
    8'h50:out <= 8'b00010110;//P
    8'h51:out <= 8'b00000111;//Q
    8'h52:out <= 8'b11110110;//R
    8'h53:out <= 8'b10000011;//S
    8'h54:out <= 8'b11010010;//T
    8'h55:out <= 8'b11101010;//U
    8'h56:out <= 8'b11110111;//V
    8'h57:out <= 8'b01011011;//W
    8'h58:out <= 8'b11110111;//X
    8'h59:out <= 8'b01000011;//Y
    8'h5A:out <= 8'b10110011;//Z
  default:
    out <= 8'b11110111; // -
  endcase

endmodule


В модуле реализована динамическая индикация, то есть в каждый момент времени отображается только один символ. Это позволяет сократить число управляющих выводов на индикатор. С динамической индикацией требуется всего 8+4=12 выводов. С прямым управлением каждым светодиодом в отдельности потребовалось бы 4*8 = 32 вывода. Порядковый номер отображаемого сейчас символа хранится в регистре [1:0]digit_idx. Позиционный код для отображаемого символа в регистре [3:0]digit_sel. Текущий отображаемый символ [7:0]a, а вот соответствующие ему биты на светодиоды индикатора - это [7:0]out. Хоть сегментов и семь и называется индикатор семисегментом, на самом деле есть еще восьмой светодиод на точку после каждого символа.

В топ модуль тестового проекта вставлено два модуля семисегментного индикатора: для шестнадцатеричных чисел и для ASCII.

При запуске проекта в FPGA на дисплейчике отображается значение счетчика. По нажатию основной кнопки на плате Марсоход2 счет приостанавливается.

Если нажать первую кнопку из дополнительных, то на дисплее покажется "1111". Если нажать вторую кнопку из дополнительных, то покажется "2222". А вот если нажать третью кнопку, то будут показываться все буквы английского алфавита по очереди.

По нажатию 4й кнопки будет показана фраза "..HELLo WorLd..." - примерно так она будет выглядеть на дисплее.

На этом видео надеюсь все видно хорошо.

Плату расширения с семисегментными индикаторами можно приобрести в интернет магазине.

 


Комментарии  
0 #7 AlanSbor 20.07.2024 11:55
А вот почему проект не сохраняется и при перезапуске не стартует, пока загадка для меня.


Цитирую AlanSbor:
Ошибка была в файле

было
seg4x7_assii seg4x7_ascii_instance(
стало
seg4x7_ascii seg4x7_ascii_instance(
.clk( CLK100MHZ ),
.in( show_string ),
.digit_sel( s1_digit_sel ),
.out( s1_out )
);


Цитирую AlanSbor:
До этого проекта все компилилось хорошо, а тут ошибку выдает. :o
Error (12006): Node instance "seg4x7_ascii_instance" instantiates undefined entity "seg4x7_assii". Ensure that required library paths are specified correctly, define the specified entity, or change the instantiation. If this entity represents Intel FPGA or third-party IP, generate the synthesis files for the IP.

EP4CE10 Marsohod2 bis
0 #6 AlanSbor 18.07.2024 18:53
Ошибка была в файле

было
seg4x7_assii seg4x7_ascii_instance(
стало
seg4x7_ascii seg4x7_ascii_instance(
.clk( CLK100MHZ ),
.in( show_string ),
.digit_sel( s1_digit_sel ),
.out( s1_out )
);


Цитирую AlanSbor:
До этого проекта все компилилось хорошо, а тут ошибку выдает. :o
Error (12006): Node instance "seg4x7_ascii_instance" instantiates undefined entity "seg4x7_assii". Ensure that required library paths are specified correctly, define the specified entity, or change the instantiation. If this entity represents Intel FPGA or third-party IP, generate the synthesis files for the IP.

EP4CE10 Marsohod2 bis
0 #5 AlanSbor 18.07.2024 18:34
До этого проекта все компилилось хорошо, а тут ошибку выдает. :o
Error (12006): Node instance "seg4x7_ascii_i nstance" instantiates undefined entity "seg4x7_assii". Ensure that required library paths are specified correctly, define the specified entity, or change the instantiation. If this entity represents Intel FPGA or third-party IP, generate the synthesis files for the IP.

EP4CE10 Marsohod2 bis
0 #4 foxtail 15.01.2021 11:51
Так. Проблема во мне. Я не той стороной вставил плату. Можно удалить мой предыдущий коммент.
0 #3 foxtail 15.01.2021 08:56
Я короче, купил эту плату со встроенным чипом памяти. Включил. И тут чип памяти, походу, короткое замыкание решил устроить и сдох. Из него повалил дым (говорят, это душа чипа), и мне его просто пришлось выломать! Как так получилось?! Почему чип памяти помер? Где там короткое замыкание произошло? Включал на Марсоходе2.
+1 #2 MacSys 31.03.2020 16:09
Спасибо что ткнули носиком :oops:
0 #1 qwe 08.09.2019 09:57
test
Добавить комментарий