标签:
芯航线——普利斯队长精心奉献
?
实验目的:1.学习状态机的相关概念
2.理解一段式、两段式以及三段式状态机的区别以及优缺点
实验平台:芯航线FPGA核心板
实验原理:
状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
编码格式 状态 | 二进制 | 独热码 | 格雷码 |
A | 3‘b000 | 8‘b0000_0000 | 4‘b0000 |
B | 3‘b001 | 8‘b0000_0010 | 4‘b0001 |
C | 3‘b010 | 8‘b0000_0100 | 4‘b0011 |
D | 3‘b011 | 8‘b0000_1000 | 4‘b0010 |
E | 3‘b100 | 8‘b0001_0000 | 4‘b0110 |
F | 3‘b101 | 8‘b0010_0000 | 4‘b0111 |
G | 3‘b110 | 8‘b0100_0000 | 4‘b0101 |
H | 3‘b111 | 8‘b1000_0000 | 4‘b0100 |
一段式,整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
两段式,用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
为了实现让FPGA输出一个HELLO字符串,首先画出其状态转移图,如图8-3所示。
由上图可以看出如果在任意态不符合转换条件,那么状态就会重新回到初始态H。且每一个状态都有特定的方向,这是一个摩尔型状态机。
module Hello(Clk,Rst_n,data,led); ? input Clk;//50M input Rst_n;//低电平复位 ? input [7:0]data; ? output reg led; ? localparam CHECK_H = 5‘b0_0001, CHECK_e = 5‘b0_0010, CHECK_la = 5‘b0_0100, CHECK_lb = 5‘b0_1000, CHECK_o = 5‘b1_0000; ? reg[4:0]state; ? always@(posedge Clk or negedge Rst_n) if(!Rst_n)begin led <= 1‘b1; state <= CHECK_H; end else begin case(state) CHECK_H: if(data == "H") state <= CHECK_e; else state <= CHECK_H; ? CHECK_e: if(data == "e") state <= CHECK_la; else state <= CHECK_H; ? CHECK_la: if(data == "l") state <= CHECK_lb; else state <= CHECK_H; ? CHECK_lb: if(data == "l") state <= CHECK_o; else state <= CHECK_H; ? CHECK_o: begin state <= CHECK_H; if(data == "o") led <= ~led; else led <= led; end ? default:state <= CHECK_H; endcase end ? endmodule |
进行分析和综合直至没有错误以及警告。可以在RTL Viewer中看到实现的状态机如图8-4所示,与预期设计相同。
`timescale 1ns/1ns `define clock_period 20 ? module Hello_tb; ? reg Clk; reg Rst_n; reg [7:0]ASCII; ? wire led; ? Hello Hello0( .Clk(Clk), .Rst_n(Rst_n), .data(ASCII), .led(led) ); ? initial Clk = 1; always#(`clock_period/2)Clk = ~Clk; ? initial begin Rst_n = 0; ASCII = 0; #(`clock_period*200); Rst_n = 1; #(`clock_period*200 + 1); forever begin ASCII = "I"; #(`clock_period); ASCII = "A"; #(`clock_period); ASCII = "M"; #(`clock_period); ASCII = "X"; #(`clock_period); ASCII = "i"; #(`clock_period); ASCII = "a"; #(`clock_period); ASCII = "o"; #(`clock_period); ASCII = "M"; #(`clock_period); ASCII = "e"; #(`clock_period); ASCII = "i"; #(`clock_period); ASCII = "g"; #(`clock_period); ASCII = "e"; ? #(`clock_period); ASCII = "H"; #(`clock_period); ASCII = "E"; ? #(`clock_period); ASCII = "M"; #(`clock_period); ASCII = "l"; ? #(`clock_period); ASCII = "H"; #(`clock_period); ASCII = "E"; #(`clock_period); ASCII = "L"; #(`clock_period); ASCII = "L"; #(`clock_period); ASCII = "O"; #(`clock_period); ? ASCII = "H"; #(`clock_period); ASCII = "e"; #(`clock_period); ASCII = "l"; #(`clock_period); ASCII = "l"; #(`clock_period); ASCII = "o"; ? #(`clock_period); ASCII = "l"; end end ? endmodule |
????至此就完成了一个简单的状态机的设计,在后面的例程中会经常用到状态机设计思想,这里也就不再对二段式、三段式状态机展开。
08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档
标签:
原文地址:http://www.cnblogs.com/xiaomeige/p/5500960.html