目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-11-25 zgf 初次建立

实验十二:有限状态机实验——一段式状态机描述

一、 实验目的与意义

  1. 掌握一段式状态机的描述方法。
  2. 掌握宏定义、参数变量的使用方法。

二、 实验设备及平台

  1. iCore3L 双核心板。
  2. XiST USB-CABLE(或相同功能)仿真器。
  3. Micro USB线缆。
  4. 装有HqFpga开发软件的电脑一台。

三、 实验原理

四、 代码讲解

图 12-1	状态转移示意图

//------------------------------------------------//
//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;
//------------------------------------------------//

五、 实验步骤及实验结果

  1. 新建工程,器件型号选择SL2S-25E-8U213C,输入类型选择RTL描述。
  2. 在“源文件”栏将例程下的源文件添加到工程中,并点击“完成”按钮。
  3. 也可以跳过添加源文件步骤,自己建立工程文件:在设计管理界面,建立各个模块对应的源文件;通过点击“+”号,将建立的源文件添加到工程中。
  4. 源文件添加完成后,点击语法检查,检查通过后退出设计管理界面。
  5. 主界面点击“RTL综合”按钮。如果有报错,通过编译报告查看错误信息并对源文件进行修改。
  6. 编译通过后点击左侧栏的“物理约束”按钮,绑定引脚信息。如果弹出的“物理约束”界面中出现的端口信号与工程代码中设计的不符,点击左侧栏“工程属性”按钮,查看“顶层模块”一栏是否为工程设计中的顶层模块。
  7. 点击左侧栏的“全部运行”按钮,进行全编译,生成bit文件。
  8. 将XiST USB Cable 连接到JTAG口,并给iCore3L核心板供电。
  9. 点击 “下载/编程”按钮,将生成的bit 文件下载到iCore3L。
  10. 可以看到iCore3L开发板上LED灯每隔3S改变一次亮灭状态。

六、 拓展实验