新闻  |   论坛  |   博客  |   在线研讨会
7段LED动态显示源码(原创)
up2002 | 2007-10-29 20:44:16    阅读:5598   发布文章


/********************LED_7seg*************************
**模块名称:LED_7seg
**功能描述:7段数码管的显示控制
************************************************/
module LED_7seg(clk_48M,seg,sl,key);
input   clk_48M;     //48M时钟输入
input [3:0] key;      //按键输入
output [7:0] seg;      //段码输出
output [3:0] sl;       //位码输出

reg  [7:0] seg_reg;     //段码寄存器
reg  [3:0] sl_reg;      //位码寄存器
reg  [15:0] disp_buf_reg;    //四位数据显示缓存区
reg  [3:0] disp_dat;     //一位数据显示缓存区
reg     [14:0]  count;      //计数器
reg  [3:0] dout1,dout2,dout3;   //去抖寄存器

wire [3:0] key_reg;     //按键控制
wire  [15:0]  disp_buf;              //显示控制


assign disp_buf = disp_buf_reg;         //显示控制
assign   key_reg = (dout1&dout2&dout3);  //去抖控制

 

always@(posedge clk_48M)     //节拍计数器
begin
 count <= count + 15'd1;
end

always@(posedge count[4])     //去抖控制
begin
 dout1 <= key;
 dout2 <= dout1;
 dout3 <= dout2;
end


always@(posedge clk_48M)     //通过按键来改变显示缓存区
begin
 if(key_reg[0])
  disp_buf_reg <= 16'h7002;
 else if(key_reg[1])
  disp_buf_reg <= 16'h8002;
 else if(key_reg[2])
  disp_buf_reg <= 16'h9002;
 else if(key_reg[3])
  disp_buf_reg <= 16'h0102;
end


always @(count[14:13])        //定义显示数据触发事件
begin
 case (count[14:13])           //选择扫描显示数据
  2'h0: disp_dat <= disp_buf[3:0];    //显示秒的个位数据
  2'h1: disp_dat <= disp_buf[7:4];     //显示秒的十位数据
  2'h2: disp_dat <= disp_buf[11:8];    //显示分的个位数据
  2'h3: disp_dat <= disp_buf[15:12];    //显示分的十位数据
 endcase
 case (count[14:13])        //选择数码管显示位
  2'h0: sl_reg <= 4'b0111;     //选择个位数码管
  2'h1: sl_reg <= 4'b1011;     //选择十位数码管
  2'h2: sl_reg <= 4'b1101;     //选择百位数码管
  2'h3: sl_reg <= 4'b1110;     //选择千位数码管
 endcase
end


always @(disp_dat)         //显示译码输出
begin
 case (disp_dat)           //选择输出数据
  4'h0: seg_reg <= 8'hc0;      //显示0
  4'h1: seg_reg <= 8'hf9;      //显示1
  4'h2: seg_reg <= 8'ha4;      //显示2
  4'h3: seg_reg <= 8'hb0;      //显示3
  4'h4: seg_reg <= 8'h99;      //显示4
  4'h5: seg_reg <= 8'h92;      //显示5
  4'h6: seg_reg <= 8'h82;      //显示6
  4'h7: seg_reg <= 8'hf8;      //显示7
  4'h8: seg_reg <= 8'h80;      //显示8
  4'h9: seg_reg <= 8'h90;      //显示9
  4'ha: seg_reg <= 8'h88;      //显示a
  4'hb: seg_reg <= 8'h83;      //显示b
  4'hc: seg_reg <= 8'hc6;      //显示c
  4'hd: seg_reg <= 8'ha1;      //显示d
  4'he: seg_reg <= 8'h86;      //显示e
  4'hf: seg_reg <= 8'h8e;      //显示f
 endcase
 //if((count[14:13]==2'h2)&&count[21])
 // seg_reg = seg_reg&8'h7f;     //小数点闪烁
end

assign seg = seg_reg;
assign sl    = sl_reg;

endmodule


//---------------------------------------
以上程序仅作参考。

ACTEL FPGA 项目开发、芯片咨询,技术交流探讨,欢迎联系TOM:
TEL:139 2466 7001    
QQ :416763076 
MSN:up.2002@hotmail.com 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
up2002  2007-10-29 20:56:10 

恩,贴出来才知道好好不好,不好再改进,放着也是放着。:-)

b03212316  2007-10-29 20:39:49 

没必要贴上来吧

FPGA/CPLD 青春公社
最近文章
“第三者”的特点
2007-10-29 21:05:40
三种类型的FPGA
2007-10-29 20:54:14
何谓反熔丝技术?
2007-10-29 20:47:41
推荐文章
最近访客