动态数码管(上)

本实验用的开发板是野火的开发板,用的是EP4CE10F17C8这个芯片,还有两片74HC595芯片和一个六位八段的数码管。

一、整体的结构框图

二、单个模块结构框图和时序图

三、数据生成模块的代码

module data_gen(

    input  wire        clk    ,
    input  wire       rst_n    ,
    output reg [19:0] data    ,
    output wire [5:0] point ,
    output wire       sign  ,
    output reg           seg_en    
);

parameter time_100ms = 4999_999 ;
parameter datamax = 999_999 ;

assign point = 6'b000_010 ; //不显示小数点
assign sign = 1'b0 ;///不显示负数

reg [23:0] cnt_100ms ;

//0.1s计数器
always @ (posedge clk, negedge rst_n)
begin
    if(~rst_n)
        cnt_100ms <= 24'd0;
    else if(cnt_100ms == time_100ms )
        cnt_100ms <= 24'd0 ;
    else 
        cnt_100ms <= cnt_100ms + 1;
end

//data 显示数据 0-999_999
always @ (posedge clk ,negedge rst_n)
begin
    if(~rst_n)
        data <= 1'b0;
    else if( data == datamax && cnt_100ms == time_100ms)
        data <= 1'b0 ;
    else if(cnt_100ms == time_100ms)
        data <= data + 1 ;
    else
        data <= data ;
end

//seg_en
always @ (posedge clk,negedge rst_n)
begin
    if(~rst_n)
        seg_en <= 0 ;
    else
        seg_en <= 1 ;

end
endmodule

四、数码管解析模块(核心)

3.1bcd8421时序图和程序设计

3.2程序设计

module bcd_8421(

    input  wire        clk     ,
    input  wire        rst_n    ,
    input  wire[19:0] data    ,
    output reg [3:0]  unit    ,
    output reg [3:0]  ten    ,
    output reg [3:0]  hun    ,
    output reg [3:0]  tho    ,
    output reg [3:0]  wan    ,
    output reg [3:0]  shiwan
    
);

reg [4:0]  cnt_shift  ;//移位计数器
reg [43:0] data_shift ; //移位判断寄存器
//判断信号先,移位计数后
reg       shift_flag ;

//cnt_shift
always @ (posedge clk ,negedge rst_n)
begin
    if(~rst_n)
        cnt_shift <= 0;
    else if(cnt_shift == 5'd21 && shift_flag == 1'b1 )
        cnt_shift <= 0 ;
    else if(shift_flag == 1 )
        cnt_shift <=  cnt_shift +1;
    else
        cnt_shift <= cnt_shift ;
end

//data_shift   移位判断寄存器
always @ (posedge clk ,negedge rst_n)
begin
    if(~rst_n)
        data_shift <= data_shift ;
    else if( cnt_shift == 5'd0 )
        data_shift <= {24'b0, data};  //{ data_shift[40],data_shift[39],data_shift[38],,,data_shift[0]]}
    else if(shift_flag == 0 && cnt_shift <= 20)
        begin
        data_shift[23:20] <= { data_shift[23:20] >4? (data_shift[23:20]+2'd3):(data_shift[23:20])};//提取unit   
        data_shift[27:24] <= { data_shift[27:24] >4? (data_shift[27:24]+2'd3):(data_shift[27:24])};//提取ten
        data_shift[31:28] <= { data_shift[31:28] >4? (data_shift[31:28]+2'd3):(data_shift[31:28])};//提取hun
        data_shift[35:32] <= { data_shift[35:32] >4? (data_shift[35:32]+2'd3):(data_shift[35:32])};//提取tho
        data_shift[39:36] <= { data_shift[39:36] >4? (data_shift[39:36]+2'd3):(data_shift[39:36])};//提取wan
        data_shift[43:40] <= { data_shift[43:40] >4? (data_shift[43:40]+2'd3):(data_shift[43:40])};//提取shiwan    
        end
    else if(cnt_shift <= 20 &&  shift_flag== 1 )
        data_shift <= data_shift << 1 ; 
    else 
        data_shift <= data_shift; 
end

//shift_flag 
always @ (posedge clk,negedge rst_n)
begin
    if(~rst_n)
        shift_flag <= 0 ;
    else 
        shift_flag <= ~shift_flag ;
end

// 当计数器等于20时,移位判断操作完成,对各个位数的BCD 码进行赋值
always @ (posedge clk,negedge rst_n)
begin
    if(~rst_n)
        begin
            unit    <= 4'b0 ;
            ten        <= 4'b0 ;
            hun        <= 4'b0 ;
            tho        <= 4'b0 ;
            wan        <= 4'b0 ;
            shiwan  <= 4'b0 ;
        end    
    else  if(cnt_shift == 5'd21)
        begin
            unit    <=  data_shift[23:20] ;
            ten        <=  data_shift[27:24] ;
            hun        <=  data_shift[31:28] ;
            tho        <=  data_shift[35:32] ;
            wan        <=  data_shift[39:36] ;
            shiwan  <=  data_shift[43:40] ;
        end    
end


/*
//假设 data == 123456 ;
assign unit    = data % 10                ;
assign ten    = (data /20'd10)%10        ;
assign hun    = (data /20'd100)%10    ;
assign tho    = (data /20'd1000)%10    ;
assign wan    = (data /20'd10000)%10    ;
assign shiwan = data /20'd100000    ;
*/


endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值