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