银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-11-25 | zgf | 初次建立 |
//------------------------------------------------// //time_cnt循环计数,周期约1秒(因为从0计数到25000000,实际上是25000001个时钟周期) reg [31:0] time_cnt; always@(posedge fpga_clk or negedge rst_n) if(!rst_n) time_cnt <= 32'd0; else if(time_cnt==32'd25000000) //以25MHz系统时钟计数,计时约1秒 time_cnt <= 32'd0; else time_cnt <= time_cnt + 1'd1; //------------------------------------------------// //拉高1个系统时钟周期的标志信号state_sig。 reg state_sig; always@(posedge fpga_clk or negedge rst_n) if(!rst_n) state_sig <= 1'b0; else if(time_cnt==32'd25000000) state_sig <= 1'b1; else state_sig <= 1'b0; //------------------------------------------------//
接下来看一下代码的主体。状态机的状态转移和不同状态下的逻辑功能实现,代码如下:
//------------------------------------------------// //定义LED状态常量寄存器 parameter LED_OFF = 3'b111; parameter LED_ON = 3'b000; //------------------------------------------------// reg [2:0] led; reg [2:0] led_state; always@(posedge fpga_clk or negedge rst_n) if(!rst_n) begin led <= 3'b111; //复位状态,三色LED为灭状态。 led_state <= `state_idle; end else case(led_state) `state_idle:begin led <= 3'b110; //idle状态三色LED显示蓝色。 if(state_sig) //检测到计时1秒标志信号,进入LED亮状态。 led_state <= `state_led_on; //此时只是状态的转移,LED状态还未改变。 else led_state <= led_state; end `state_led_on:begin led <= LED_ON; //进入LED亮状态后点亮三色LED. if(state_sig) led_state <= `state_led_off; else led_state <= led_state; end `state_led_off:begin led <= LED_OFF; //关断LED。 if(state_sig) led_state <= `state_led_on; else led_state <= led_state; end endcase assign fpga_led = led; //------------------------------------------------//