FPGA第三个实验---静态数码管显示

        设计如下:数码管从1到F循环变化,变化一次的时间为0.5s

        FPGA顶层模块例化两个模块:计时模块,数码管静态显示模块。计时模块几时到0.5s时的标志信号flag传递给数码管静态显示模块,数码管静态显示模块接收到此信号时显示的数值加1。

        计时模块:计时模块对系统时钟进行计数,当计时到给定值时输出标志信号。

        数码管静态显示模块:数码管静态显示模块在数码管上以静态方式显示数值。

        顶层模块代码:

        

module smg_jtxs(         //定义两个输入信号,时钟信号s_clk,复位信号rst
    input s_clk,         //两个输出信号,数码管位选信号wx,段选信号dx
    input rst,
    output [5:0] wx,
    output [7:0] dx
);
parameter max_t = 25'd2500_0000;   //定义延时参数变量,系统时钟50MHz,计数2500-0000刚好为0.5s
wire a_flag;                       //定义计数标志变量,当计满0.5s,标志位使数码管发生变化
smg_jtqd u_smg_jtqd(
    .s_clk (s_clk),
    .rst (rst),
    .s_flag (a_flag),
    .wx (wx),
    .dx (dx)
);
t_c #(.max_c (max_t)) u_t_c(
    .s_clk (s_clk),
    .rst (rst),
    .flag (a_flag)
);
endmodule

        计时模块代码:

module t_c(                       //定义两个输入变量,时钟信号s_clk,复位信号rst             
    input s_clk,                  //定义一个输出变量flag
    input rst,
    output reg flag
);
parameter max_c = 2500_0000;      //定义计数时间0.5s
reg [24:0] c;
always @(posedge s_clk or negedge rst)  //当S_CLK上升沿或者rst下降沿时触发
begin
    if(!rst) begin                      //如果复位信号有效,标志变量falg,计数值c初始化清零
        flag <= 1'b0;
        c <= 24'b0;
    end
    else if(c < max_c - 1'b1) begin     //如果计数值小于0.5s,标志位flag为0,计数值加1
        flag <= 1'b0;
        c <= c + 1'b1;                  //如果计数值达到0.5s,标志位flag变1,计数值清零
    end
    else begin 
        flag <= 1'b1;
        c <= 24'b0;
    end
end
endmodule

        数码管静态显示驱动模块:

module smg_jtqd(                  //定义输入时钟信号s_clk,复位信号rst,标志信号s_clk
    input s_clk,                  //定义输出信号位选信号wx,段选信号dx,这两个信号控制数码管显
    input rst,                    //示
    input s_flag,
    output reg [5:0] wx,
    output reg [6:0] dx
); 
reg [3:0] num;                    //定义状态选择变量,1~f15个变量状态
always @(posedge s_clk or negedge rst)  //s_clk上升沿或者rst下降沿触发
begin 
    if(!rst)                         //复位信号有效位选信号置1,否则置0
        wx <= 6'b111111;
    else
        wx <= 6'b000000;
 end
always @(posedge s_clk or negedge rst)   //s_clk上升沿或者rst下降沿触发
begin
    if(!rst)                             //复位信号有效,状态选择变量num为0
        num <= 4'h0;
    else if(s_flag) begin                //当计满0.5s时,标志信号为1,状态变量加1
        if(num < 4'hf)
            num <= num + 1'b1;           //当状态变量num<F时,状态变量清零
        else
            num <= 4'h0;                 //当标志信号无效时,状态选择变量保持不变
    end  
    else
        num <= num;
 end
 always @(posedge s_clk or negedge rst)   //s_clk上升沿或者rst下降沿触发
begin
    if(!rst)                              //复位信号有效时,段选信号dx置0
        dx <= 8'b0;
    else begin
        case(num)                         //case结构,根据不同的状态变量num,输出不同的显示
            4'h0 : dx <= 8'b1100_0000;
            4'h1 : dx <= 8'b1111_1001;
            4'h2 : dx <= 8'b1010_0100;
            4'h3 : dx <= 8'b1011_0000;
            4'h4 : dx <= 8'b1001_1001;
            4'h5 : dx <= 8'b1001_0010;
            4'h6 : dx <= 8'b1000_0010;
            4'h7 : dx <= 8'b1111_1000;
            4'h8 : dx <= 8'b1000_0000;
            4'h9 : dx <= 8'b1001_0000;
            4'ha : dx <= 8'b1000_1000;
            4'hb : dx <= 8'b1000_0011;
            4'hc : dx <= 8'b1100_0110;
            4'hd : dx <= 8'b1010_0001;
            4'he : dx <= 8'b1000_0110;
            4'hf : dx <= 8'b1000_1110;
            default : dx <= 8'b1100_0000;
        endcase
    end
end
endmodule

 

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值