§ Описание

Существуют ситуации, когда надо вывести какую-то отладочную информацию на экран, но не хочется создавать сложные видеоадаптеры и вполне достаточно вывести только 3 байта на панель из 6 сегментов семисегментных индикаторов. Для этого я написал небольшой модуль, который позволит это сделать без проблем. Также он умеет отключать некоторые сегменты и снижать яркость через использование ШИМ (PWM). Подключается просто:
dhex HD(.clock(CLOCK_50), .i(24'hDE_AD_BF), .o({HEX5,HEX4,HEX3,HEX2,HEX1,HEX0}));
Входящие данные i, а исходящие секции сегментных индикаторов o.

§ Код модуля dhex.v

module dhex
(
    input           clock,  // Для снижения яркости
    input   [23:0]  i,      // Input 6x4
    input   [ 5:0]  x,      // Disabled Led (=1)
    output  [41:0]  o       // Output 6x7
);

// Константа, в которой закодированы все образы символов для семисегмента
wire [127:0] D = 128'b00001110_00000110_00100001_01000110_00000011_00001000_00010000_00000000_01111000_00000010_00010010_00011001_00110000_00100100_01111001_01000000;

// Для более понятного обозначения в дальшейшем
wire [3:0] a = i[  3:0], b = i[  7:4];
wire [3:0] c = i[ 11:8], d = i[15:12];
wire [3:0] e = i[19:16], f = i[23:20];

// Уменьшить яркость светодиодов
reg [15:0] tm;

wire       cr = tm < 16'hF000;
wire [6:0] br = {7{cr}};

// Мультиплексирование
assign o[  6:0] = {D[{a,3'h6}], D[{a,3'h5}], D[{a,3'h4}], D[{a,3'h3}], D[{a,3'h2}], D[{a,3'h1}], D[{a,3'h0}]} | {7{x[0]}} | br;
assign o[ 13:7] = {D[{b,3'h6}], D[{b,3'h5}], D[{b,3'h4}], D[{b,3'h3}], D[{b,3'h2}], D[{b,3'h1}], D[{b,3'h0}]} | {7{x[1]}} | br;
assign o[20:14] = {D[{c,3'h6}], D[{c,3'h5}], D[{c,3'h4}], D[{c,3'h3}], D[{c,3'h2}], D[{c,3'h1}], D[{c,3'h0}]} | {7{x[2]}} | br;
assign o[27:21] = {D[{d,3'h6}], D[{d,3'h5}], D[{d,3'h4}], D[{d,3'h3}], D[{d,3'h2}], D[{d,3'h1}], D[{d,3'h0}]} | {7{x[3]}} | br;
assign o[34:28] = {D[{e,3'h6}], D[{e,3'h5}], D[{e,3'h4}], D[{e,3'h3}], D[{e,3'h2}], D[{e,3'h1}], D[{e,3'h0}]} | {7{x[4]}} | br;
assign o[41:35] = {D[{f,3'h6}], D[{f,3'h5}], D[{f,3'h4}], D[{f,3'h3}], D[{f,3'h2}], D[{f,3'h1}], D[{f,3'h0}]} | {7{x[5]}} | br;

always @(posedge clock) tm <= tm + 1;

endmodule