7SEG 8 Digits
今回はこの8桁7segLEDを制御してみます。
このモジュールはシリアル(SPI)でセットしたデータをスタチックに点灯するようになっているので
電源、グランドと3本の信号線だけという少ない配線(合計5本)で点灯させることができます。
http://www.robotshop.com/en/dfrobot-8-character-7-segment-spi-led-module.html
インターフェースはシリアルなので、まず2進→10進変換をおこなって、次に各桁のセグメント情報を
パラレルからシリアル変換して転送すればよいことになります。
32ビット8桁10進数変換処理
b32todig8.v
module b32todig8(input clock, input reset_n, input [31:0]bindata, output reg [3:0] dig_8, output reg [3:0] dig_7, output reg [3:0] dig_6, output reg [3:0] dig_5, output reg [3:0] dig_4, output reg [3:0] dig_3, output reg [3:0] dig_2, output reg [3:0] dig_1);
always@(negedge reset_n or negedge clock)
begin
if (reset_n == 0)
begin
dig_8 = 0;
dig_7 = 0;
dig_6 = 0;
dig_5 = 0;
dig_4 = 0;
dig_3 = 0;
dig_2 = 0;
dig_1 = 0;
end
else
begin
dig_1 = ( bindata / 10 ) % 10;
dig_2 = ( bindata / 100 ) % 10;
dig_3 = ( bindata / 1000 ) % 10;
dig_4 = ( bindata / 10000 ) % 10;
dig_5 = ( bindata / 100000 ) % 10;
dig_6 = ( bindata / 1000000 ) % 10;
dig_7 = ( bindata / 10000000 ) % 10;
dig_8 = ( bindata / 100000000 ) % 10;
end
end
endmodule
64ビットパラレルシリアル変換処理
para2Ser64.v
module para2Ser64(clock_in,reset_n,data_in,clock_out,data_out_n,strobe_out_n);
input clock_in, reset_n;
input [63:0]data_in;
output clock_out, data_out_n, strobe_out_n;
reg clock_out, data_out_n, strobe_out_n;
reg [7:0]counter;
reg [63:0]temp;
always @(posedge clock_in or negedge reset_n)
begin
if (rst_n == 0)
begin
clock_out = 0;
data_out = 0;
strobe_out_n = 1;
counter = 0;
temp = data_in;
end
else
begin
counter = counter + 1;
if (counter < 129)
begin
if (counter[0] == 1)
begin
clock_out = 0;
data_out_n = ~temp[63];
temp = temp << 1;
end
else
begin
clock_out = 1;
end
end
else if (counter < 131)
begin
if (counter[0] == 1 )
begin
strobe_out_n = 0;
end
else
begin
strobe_out_n = 1;
end
end
else
begin
counter = 0;
temp = data_in;
end
end
end
endmodule