标题: fpga数码管动态扫描程序 [打印本页]

作者: bibi    时间: 2015-4-19 01:30
标题: fpga数码管动态扫描程序
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








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1