|
module display(datain,dataout);
input[3:0] datain;
output[7:0] dataout;//段碼
reg[7:0] dataout;
always@(datain)
case(datain)
8'd0: dataout=8'b11000000;
8'd1: dataout=8'b11111001;
8'd2: dataout=8'b10100100;
8'd3: dataout=8'b10110000;
8'd4: dataout=8'b10011001;
8'd5: dataout=8'b10010010;
8'd6: dataout=8'b10000010;
8'd7: dataout=8'b11111000;
8'd8: dataout=8'b10000000;
8'd9: dataout=8'b10010000;
default: dataout=8'b11111111;
endcase
endmodule
(注:以上是基于pnp管開關的,就是段碼為1,燈滅,0燈亮,一般的數碼管應該是反過來的)
如果只需驅動一位數碼管就很簡單,直接輸入數即可;如果驅動多位數碼管,就需要動態掃描顯示了,假如是八位數碼管顯示,這時就要先設計一個計數器了,八位計數器,不斷掃描,而且頻率也要設計好,每次只驅動一個管子,由于頻率很快,等光殘影等,人眼根本分辨不出,就造成了所有管子都亮的效果。程序如下
module view(din,clk,rst,dout,dataout);
input clk,rst;
input[23:0] din;
output[7:0] dout;//驅動使能端,有八位,0有效,綁定到對應的使能端
output[7:0] dataout;//段碼輸出,綁定到對應的led段碼端
reg[10:0] count;//分頻,因為輸入時鐘太大
reg[7:0] dout;
reg[3:0] data;
reg[2:0] count1;//八位計數器,不斷掃描
reg clk1;
display u1(data,dataout);//調用段碼程序
always@(posedge clk)begin
count<=count+1;
if(count==1)
clk1<=~clk1;
end
always@(posedge clk1 or posedge rst)begin
if(rst)begin
data=0;dout=8'b11111110;
end
else begin
count1<=count1+1;
case(count1)
3'd0: begin dout=8'b11111110; data=din[3:0];end//要顯示的數,可以改為一個具體數
3'd1: begin dout=8'b11111101; data=din[7:4];end
3'd2: begin dout=8'b11111011; data=din[11:8];end
3'd3: begin dout=8'b11110111; data=din[15:12];end
3'd4: begin dout=8'b11101111; data=din[19:16];end
3'd5: begin dout=8'b11011111; data=din[23:20];end
3'd6: begin dout=8'b11111111; data=din[7:4];end
3'd7: begin dout=8'b11111111;data=din[7:4];end
endcase
end
end
endmodule
|
|