|
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管開關(guān)的,就是段碼為1,燈滅,0燈亮,一般的數(shù)碼管應(yīng)該是反過來的)
如果只需驅(qū)動(dòng)一位數(shù)碼管就很簡單,直接輸入數(shù)即可;如果驅(qū)動(dòng)多位數(shù)碼管,就需要?jiǎng)討B(tài)掃描顯示了,假如是八位數(shù)碼管顯示,這時(shí)就要先設(shè)計(jì)一個(gè)計(jì)數(shù)器了,八位計(jì)數(shù)器,不斷掃描,而且頻率也要設(shè)計(jì)好,每次只驅(qū)動(dòng)一個(gè)管子,由于頻率很快,等光殘影等,人眼根本分辨不出,就造成了所有管子都亮的效果。程序如下
module view(din,clk,rst,dout,dataout);
input clk,rst;
input[23:0] din;
output[7:0] dout;//驅(qū)動(dòng)使能端,有八位,0有效,綁定到對(duì)應(yīng)的使能端
output[7:0] dataout;//段碼輸出,綁定到對(duì)應(yīng)的led段碼端
reg[10:0] count;//分頻,因?yàn)檩斎霑r(shí)鐘太大
reg[7:0] dout;
reg[3:0] data;
reg[2:0] count1;//八位計(jì)數(shù)器,不斷掃描
reg clk1;
display u1(data,dataout);//調(diào)用段碼程序
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//要顯示的數(shù),可以改為一個(gè)具體數(shù)
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
|
|