MCU

FPGA学习一~~数码管动态显示

0
阅读(2762)

说明一下  我用的是Actel的A3PO30板  晶振是48M的   程序解释得很详细

首先是分频的模块

module clk_div
 (
 clk,         //时钟输入,48M
 reset,       //异步复位输入,高电平复位
 clk_out      //分频时钟输出
 );
parameter  cnt_top=24'd24000000; // 分频系数  每24000000个时钟周期变一次  刚好0.5S
input      clk;                  // 端口定义
input      reset;
output     clk_out;
reg        clk_out;              // 寄存器定义
reg        [24:0] clk_cnt;

always @(posedge clk or negedge reset)     
begin
 if(!reset)                    //复位
 begin
  clk_out <= 1'b0;
  clk_cnt <= 0;
 end
 else
 begin
  if(clk_cnt==cnt_top-1)
  begin
   clk_out <= ~clk_out;     //分频输出
   clk_cnt <= 0;
  end
  else
   clk_cnt <= clk_cnt+1'b1; //计数器加1
 end
end
endmodule


接着是显示模块
module ledstate(
 clk,           //时钟输入,48M
 reset,         //复位输入,低电平有效
 wei_out,       // 数码管的位选

 data_out       //数码管数据输出

 );
input   clk;       
input   reset;    
output [3:0]wei_out;
reg     [3:0]wei;
output [6:0]data_out;     // 输出段数据
reg  [6:0]dout;           //寄存器定义

wire   clk_out;           //计数的时钟,分频得到,周期:1S

reg  [3:0] sts;

parameter st1 = 4'b0001,    //状态机状态1参数定义
          st2 = 4'b0010,    //状态机状态2参数定义
          st3 = 4'b0100,    //状态机状态3参数定义
          st4 = 4'b1000;    //状态机状态4参数定义


always @(posedge clk_out or negedge reset)    //  每一个状态持续一个clk_out的周期
begin
 if(!reset)
 begin
  dout<= 7'b1111111;   //复位的时候数码管全灭

  wei<= 4'b1111;
  sts <= st1;
 end
 else
 case(sts)
  st1:      //状态1
   begin
     wei<= 4'b1110;
     dout <= 7'b100_0000;
     sts <= st2;  
   end

  st2:      //状态2
   begin
    wei<= 4'b1101;
    dout <= 7'b111_1001;
    sts <= st3;  

   end

  st3:      //状态3
   begin
    dout <= 7'b010_0100;

    wei<= 4'b1011;
    sts <= st4;   

   end
  st4:      // 状态4    
   begin
    wei<= 4'b0111;
    dout <= 7'b011_0000;
    sts <= st1;  
   end

  default:

    sts <= st1;   //复位的时候值为st1
 endcase
end

assign data_out=dout;
assign wei_out=wei;

 


clk_div clk_div_0(     //分配得到2S的时钟,便于观察
       .clk(clk),      // 时钟输入,48M
       .reset(reset),  // 异步复位输入,高电平复位
       .clk_out(clk_out) // 分频时钟输出
                  );

endmodule