§ Описание
Существуют ситуации, когда надо вывести какую-то отладочную информацию на экран, но не хочется создавать сложные видеоадаптеры и вполне достаточно вывести только 3 байта на панель из 6 сегментов семисегментных индикаторов. Для этого я написал небольшой модуль, который позволит это сделать без проблем. Также он умеет отключать некоторые сегменты и снижать яркость через использование ШИМ (PWM). Подключается просто:
dhex6 HD(.clock(CLOCK_50), .i(24'hDE_AD_BF), .o({HEX5,HEX4,HEX3,HEX2,HEX1,HEX0}));
Входящие данные
i
, а исходящие секции сегментных индикаторов
o
.
§ Код модуля
module dhex6
(
input clock,
input [23:0] i,
input [ 5:0] x,
output [41:0] o
);
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