热度 4
2016-5-19 15:28
3208 次阅读|
4 个评论
关于时钟计数器模块, 实现功能时钟计数: 毫秒,秒,分钟.....计数满清零 使用BCD计数,进位加一 按键控制(消抖模块),分频(时钟基准10hz,数码管扫描时钟400hz),计时累加模块 使用同一按键表示(开始,停止,清零)三种功能.同样,可以使用不同的按键控制,个人实现 扩展:可加入定时功能,通过设定的时间蜂鸣器响 操作平台:小梅哥"芯航线"板卡 效果: 设计RTL视图如下 分开截图了 整体好像太大了图片............. 设计基本都是以前笔记实现的模块进行累加的,关于按键消逗,分频,BCD计数,数码管不了解的都可以查看以前的笔记......这里不废话了 部分代码: 同一按键控制3个功能: ctrl模块: reg ctrl_state; always@(posedge sys_clk or negedge rst_n) if(!rst_n)begin clear = 1'b0; count = 1'b0; stop = 1'b0; ctrl_state = 2'd0; end else if(ButtonSig ctrl_state == 2'd0)begin//清零 clear = 1'b1; ctrl_state = 2'd1; end else if(ButtonSig ctrl_state == 2'd1)begin//使能计数 count = 1'b1; ctrl_state = 2'd2; end else if(ButtonSig ctrl_state == 2'd2)begin//停止计数 stop = 1'b1; ctrl_state = 2'd0; end else begin//无按键状态 clear = 1'b0; count = 1'b0; stop = 1'b0; ctrl_state = ctrl_state; end timer模块: //计数器状态转换 always@(posedge sys_clk or negedge rst_n) if(!rst_n) timer_state = 2'b00; else if(count) //使能计数 timer_state = 2'b01; else if(stop) //停止计数 timer_state = 2'b10; else timer_state = timer_state; 计数累加模块: //根据计数器状态设置来选择是否输入计数使能信号 assign cin_0_1 = (timer_state == 2'b01)?En:1'b0; BCD_Counter #( .Conuter_Top(4'd9) ) BCD_Counter_0_1( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cin_0_1), .clr(clr), .cout(cout_0_1), .q(q_0_1) ); BCD_Counter #( .Conuter_Top(4'd9) ) BCD_Counter_s_L( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cout_0_1), .clr(clr), .cout(cout_s_L), .q(q_s_L) ); BCD_Counter #( .Conuter_Top(4'd5) ) BCD_Counter_s_H( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cout_s_L), .clr(clr), .cout(cout_s_H), .q(q_s_H) ); BCD_Counter #( .Conuter_Top(4'd9) ) BCD_Counter_m_L( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cout_s_H), .clr(clr), .cout(cout_m_L), .q(q_m_L) ); BCD_Counter #( .Conuter_Top(4'd5) ) BCD_Counter_m_H( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cout_m_L), .clr(clr), .cout(cout_m_H), .q(q_m_H) ); BCD_Counter #( .Conuter_Top(4'd9) ) BCD_Counter_H( .sys_clk(sys_clk), .rst_n(rst_n), .cin(cout_m_H), .clr(clr), .cout(), .q(q_H) );