原创 数码管动态扫描实验

2011-3-14 10:11 5656 8 8 分类: FPGA/CPLD

 


实验原理    


        硬件电路图如图1所示,图中J1连接着8个共阳数码管的数据段(段码):a,b,c,d,e,f,g,dp,J2连接着选通端(位码)。8个数码管分别由8个选通信号CS1~CS8来选择。例如在某一时刻,CS4为低电平“0”,其余位码为高电平“1”时,这时仅CS4所对应的数码管能显示来自段码的数据,而其他的数码管呈现关闭状态。所以希望8个数码管显示希望的数据,就必须让8个选通信号轮流选通,并在每一个选通时间内在数据口加上当前位显示的段码,这样就实现了动态扫描的目的。虽然每次只有一个数码管显示,但是只要扫描速率够快,由于人视觉的余晖效应,看起来所有的数码管都在同时显示。


fc4adfa0-f0db-4f94-8426-d0aa549e1aa1.jpg


图1  8位共阳数码管电路图


 


Verilog代码


/*
功能:    动态八位数码管扫描
输入参数:扫描时钟clk_1k,待显示的数据d
输出参数:数码管段码输出seg,数码管位码输出dig
备注:    待显示的数据为16进制格式,例如输入0x12345678,显示12345678
*/
module scan_led(clk_1k,d,dig,seg);  //模块名suan_led
input clk_1k;       //输入时钟
input[31:0] d;       //输入要显示的数据
output[7:0] dig;      //数码管选择输出引脚
output[7:0] seg;      //数码管输出引脚
reg[7:0] seg_r;       //定义数码管输出寄存器
reg[7:0] dig_r;       //定义数码管选择输出寄存器
reg[3:0] disp_dat;      //定义显示数码寄存器
reg[2:0] count;       //定义计数寄存器


assign dig = dig_r;      //输出数码管选择
assign seg = seg_r;      //输出数码管译码结果



always @(posedge clk_1k)    //定义上升沿触发进程
begin
        count <= count +1'b1;
end


always @(posedge clk_1k)
begin
         case(count)      //选择扫描显示数据
                  3'd0 : disp_dat = d[31:28]; //第一个数码管
                  3'd1 : disp_dat = d[27:24]; //第二个数码管
                  3'd2 : disp_dat = d[23:20]; //第三个数码管
                  3'd3 : disp_dat = d[19:16]; //第四个数码管
                  3'd4 : disp_dat = d[15:12]; //第五个数码管
                  3'd5 : disp_dat = d[11:8]; //第六个数码管
                  3'd6 : disp_dat = d[7:4]; //第七个数码管
                  3'd7 : disp_dat = d[3:0]; //第八个数码管
                  default : disp_dat = 0; 
         endcase


         case(count)      //选择数码管显示位
                  3'd0 : dig_r = 8'b0111_1111;//选择第一个数码管显示
                  3'd1 : dig_r = 8'b1011_1111;//选择第二个数码管显示
                  3'd2 : dig_r = 8'b1101_1111;//选择第三个数码管显示
                  3'd3 : dig_r = 8'b1110_1111;//选择第四个数码管显示
                  3'd4 : dig_r = 8'b1111_0111;//选择第五个数码管显示
                  3'd5 : dig_r = 8'b1111_1011;//选择第六个数码管显示
                  3'd6 : dig_r = 8'b1111_1101;//选择第七个数码管显示
                  3'd7 : dig_r = 8'b1111_1110;//选择第八个数码管显示
                  default : dig_r = 8'b1111_1111;
         endcase
end


always @(disp_dat)
begin
         case (disp_dat)     //七段译码
                  4'h0 : seg_r = 8'hc0; //显示"0"
                  4'h1 : seg_r = 8'hf9; //显示"1"
                  4'h2 : seg_r = 8'ha4; //显示"2"
                  4'h3 : seg_r = 8'hb0; //显示"3"
                  4'h4 : seg_r = 8'h99; //显示"4"
                  4'h5 : seg_r = 8'h92; //显示"5"
                  4'h6 : seg_r = 8'h82; //显示"6"
                  4'h7 : seg_r = 8'hf8; //显示"7"
                  4'h8 : seg_r = 8'h80; //显示"8"
                  4'h9 : seg_r = 8'h90; //显示"9"
                  4'ha : seg_r = 8'h88; //显示"a"
                  4'hb : seg_r = 8'h83; //显示"b"
                  4'hc : seg_r = 8'hc6; //显示"c"
                  4'hd : seg_r = 8'ha1; //显示"d"
                  4'he : seg_r = 8'h86; //显示"e"
                  4'hf : seg_r = 8'h8e; //显示"f"
                  default: seg_r = 8'hff;//不显示
         endcase
end
endmodule


 


参考资料


[1]  周立功,SmartEDA多功能教学实验开发平台EDA实验教程(一),2006.10


   

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条