共阴极数码管:公共端为阴极,加阳极数码管点亮。即当真值为1时,数码管点亮;真值为0时,数码管不亮。
共阳极数码管:公共端为阳极,加阴极数码管点亮。即当真值为0时,数码管点亮;真值为1时,数码管不亮。
六位一体数码管是属于动态显示,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示 数据,不会有闪烁感。
六位一体数码管的相同的段都接在了一起,一共是 8 个引脚,然后加上 6 个控制信号引 脚,一共是 14 个引脚,如图 15.2 所示,其中 DIG[0..7]是对应数码管的 A,B,C,D,E,F,G,H(即点 DP);SEL[0..5]是六个数码管的六个控制引脚,也是低电平有效,当控制引脚为低电平时,对 应的数码管有了供电电压,这样数码管才能点亮,否则无论数码管的段如何变化,也不能点亮 对应的数码管。
注:本片只做四位显示
Verilog代码如下
//基于Verilog的共阳极四位数码管控制模块
module V_LED_SEG (//顶层模块
input clk,//时钟信号
input rst,//复位信号
input [13:0]sumin,//输入数据
output reg[6:0] sel_data,//输出段码
output reg sel_cs1,sel_cs2,sel_cs3,sel_cs4,//数码管片选
);
wire [6:0] sel_ge,sel_shi,sel_bai,sel_qian;
wire [3:0]ge,shi,bai,qian;
reg [13:0]a,b;
//assign sumin1 = 14'd1234;
//实例化数码管模块
seven_seg out_ge(
.num1(ge),
.data1(sel_ge)
);
//实例化数码管模块
seven_seg out_shi(
.num1(shi),
.data1(sel_shi)
);
//实例化数码管模块
seven_seg out_bai(
.num1(bai),
.data1(sel_bai)
);
//实例化数码管模块
seven_seg out_qian(
.num1(qian),
.data1(sel_qian)
);
//实例化Multiplier_out模块
Multiplier_out Multiplier_out(
.sumin(sumin),
.ge(ge),
.shi(shi),
.bai(bai),
.qian(qian)
);
//共阳极数码管控制
wire [30:0]cntclk;
reg[30:0]cnt;
always @(posedge clk , negedge rst) begin
if(!rst)begin
cnt<='d0;
end
else begin
cnt<=cnt+'d1;
end
end
assign cntclk = cnt[9];
assign cntclk1 = cnt[13];
assign cntclk2 = cnt[8];
reg [2:0]clkw;
always@(posedge cntclk1,negedge rst) begin
if(!rst) begin
clkw<=3'b01;
end
else begin
if(clkw==3'b101)begin
clkw<=3'b01;
end
else begin
clkw<=clkw+1;
end
end
end
//数码管显示
reg [6:0]sel_ge1,sel_shi1,sel_bai1,sel_qian1;
always@(posedge cnt,negedge rst)begin
if(!rst)begin
sel_ge1<=7'b0000000;
sel_shi1<=7'b0000000;
sel_bai1<=7'b0000000;
sel_qian1<=7'b0000000;
end else
begin
sel_ge1<=sel_ge;
sel_shi1<=sel_shi;
sel_bai1<=sel_bai;
sel_qian1<=sel_qian;
end
end
always@(posedge cntclk,negedge rst)begin
if(!rst)begin
sel_cs1<=1'b1;
sel_cs2<=1'b1;
sel_cs3<=1'b1;
sel_cs4<=1'b1;
end
else begin
case(clkw)
3'b001:begin//千位
{sel_cs1,sel_cs2,sel_cs3,sel_cs4}<=4'b0111;
sel_data<=sel_qian1;
end
3'b010:begin//百位
{sel_cs1,sel_cs2,sel_cs3,sel_cs4}<=4'b1011;
sel_data<=sel_bai1;
end
3'b011:begin //十位
{sel_cs1,sel_cs2,sel_cs3,sel_cs4}<=4'b1101;
sel_data<=sel_shi1;
end
3'b100:begin
{sel_cs1,sel_cs2,sel_cs3,sel_cs4}<=4'b1110;
sel_data<=sel_ge1;
end
default:begin
{sel_cs1,sel_cs2,sel_cs3,sel_cs4}<=4'b1111;
end
endcase
end
end
endmodule
//七段数码管模块
module seven_seg(num1,data1);
input [3:0]num1;
output [6:0]data1;
reg [6:0]data1;
always@(num1) begin
case (num1)
4'd0: begin data1 = 7'b1000000; end
4'd1: begin data1 = 7'b1111001; end
4'd2: begin data1= 7'b0100100; end
4'd3: begin data1 = 7'b0110000; end
4'd4: begin data1 = 7'b0011001; end
4'd5: begin data1 = 7'b0010010; end
4'd6: begin data1 = 7'b0000010; end
4'd7: begin data1 = 7'b1111000; end
4'd8: begin data1 = 7'b0000000; end
4'd9: begin data1 = 7'b0010000; end
default: begin data1 = 7'b1111111; end
endcase
end
endmodule
//数位转换模块
module Multiplier_out(
sumin,//乘法器输出
ge,//个位
shi,//十位
bai,//百位
qian//千位
);
input [13:0]sumin;
output [3:0]ge,shi,bai,qian;
reg [3:0]ge,shi,bai,qian;
always@(sumin) begin
qian=sumin/1000;//千位
bai=(sumin-qian*1000)/100;//百位
shi=(sumin-qian*1000-bai*100)/10;//十位
ge=sumin-qian*1000-bai*100-shi*10;//个位
end
endmodule