基于Verilog的共阳极数码管扫描显示模块

        共阴极数码管:公共端为阴极,加阳极数码管点亮。即当真值为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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值