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

2010-4-17 11:15 3546 9 10 分类: FPGA/CPLD

说明一下  我用的是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

文章评论1条评论)

登录后参与讨论

用户1580736 2011-3-18 11:44

学习了我。
相关推荐阅读
用户1623314 2011-01-22 14:52
STM32入门系列教程之十五《如何使用SecureCRT串口终端软件》
attachment download...
用户1623314 2011-01-22 14:51
STM32入门系列教程之十四《STM32的USB下载调试》
attachment download...
用户1623314 2011-01-22 14:50
STM32入门系列教程之十三《点亮LCD液晶屏》
attachment download...
用户1623314 2011-01-22 14:49
STM32入门系列教程之十二《实时时钟RTC编程》
attachment download...
用户1623314 2011-01-22 14:48
STM32入门系列教程之十一《Systick编程》
attachment download...
用户1623314 2011-01-22 14:47
STM32入门系列教程之十《定时器与蜂鸣器》
attachment download...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条