8x8 LED制御

( Olimex MOD-LED8x8 , Verilog , Control )

Olimex社が出しているMOD-LED8x8の制御をしてみます。

製品ページはこちら(新しいウィンドウが開きます)。

このデバイスは、点灯箇所を64ビットのシリアルで設定します。

下のようなモジュールで表示設定します。

sclk, sdat, stbはMOD8x8モジュールに接続します。

clkinに250kHz程度のクロックを入れます。

rstnにはリセット時にローパルスを入れます(ここはロジックハイにしておいてもOK)。

sel[5..0]には点灯する番号をいれます。

Verilog Code (Serial Interface):

module MOD8x8LED(clkin,rstn,sel, sclk,sdat,stb);

input clkin, rstn;

output reg sclk,sdat,stb;

input [5:0] sel;

reg [7:0] counter;

reg [7:0] ccount;

reg [2:0] index;

reg [7:0] led [8];

reg [7:0] com [8];

reg [7:0] tmp;

always@(negedge clkin or negedge rstn)

begin

if (!rstn) begin

led [0] = 8'H00;

led [1] = 8'H00;

led [2] = 8'H00;

led [3] = 8'H00;

led [4] = 8'H00;

led [5] = 8'H00;

led [6] = 8'H00;

led [7] = 8'H00;

com [0] = 8'H01;

com [1] = 8'H02;

com [2] = 8'H04;

com [3] = 8'H08;

com [4] = 8'H10;

com [5] = 8'H20;

com [6] = 8'H40;

com [7] = 8'H80;

index = 0;

counter = 0;

tmp = led[0];

stb = 0;

sclk = 0;

sdat = 0;

end

else begin

led [0] = 8'H00;

led [1] = 8'H00;

led [2] = 8'H00;

led [3] = 8'H00;

led [4] = 8'H00;

led [5] = 8'H00;

led [6] = 8'H00;

led [7] = 8'H00;

led [sel >> 3 ] = com [sel % 8];

//1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 STB

//12 34 56 78 910 1112 1314 1516 - 1718 1920 2122 2324 2526 2728 2930 3132 -3334

counter = counter + 1;

if (counter == 33 || counter == 34 || counter == 35 || counter == 36) begin

if (counter == 33 || counter == 34) begin

stb = 0;

sclk = 0;

sdat = 0;

end

else begin

if (counter & 1) begin

stb = 1;

end

else begin

stb = 0;

counter = 0;

end

end

end

else begin

if (counter & 1) begin

sclk = 0;

sdat = tmp & 1;

tmp = tmp >> 1;

end

else begin

sclk = 1;

if (counter==16) begin

tmp = com[index];

end

else if (counter==32) begin

index = index + 1;

tmp = led[index];

end

end

end

end

end

endmodule

Audio Level Matrix:

このモジュールを使用して、オーディオのステレオレベルを2次元に表示してみます。

Verilogコード(Audio Matrix):

module AudLevelMatrix(aud_r, aud_l, mat);

input [2:0] aud_r;

input [2:0] aud_l;

output reg [5:0] mat;

always@(*)

begin

mat[5:3] = aud_r;

mat[2:0] = aud_l;

end

endmodule

上記モジュールに24bitのオーディオ信号のL, Rのビット22からビット20を入れてみます。

実際には64ビットのうち1ビットしか点灯してないはずですが、残像現象によって、下記のように見えます。

下記の写真で、斜め上に一本のラインが点灯すれば、LR共に同じレベルでオーディオが出力されていることになります。

曲によって、かなり変わります。。