首页 > 其他分享 >FPGA入门笔记006——状态机设计实例

FPGA入门笔记006——状态机设计实例

时间:2023-11-23 16:23:28浏览次数:33  
标签:forever FPGA clock Clk period 状态机 006 Rst ASCII

状态分析:

微信图片_20231123142212

状态1:等待“H”的到来,如果检测到“H”,进入状态2,检测“e”,否则一直等待“H”;

状态2:检测当前字符是否是“e”,如果是“e”,跳转到状态3,检测“l”,否则,回到状态1,重新等待“H”;

状态3:检测当前字符是否是“l”,如果是“l”,跳转到状态4,检测“l”,否则,回到状态1,重新等待“H”;

状态4:检测当前字符是否是“l”,如果是“l”,跳转到状态5,检测“o”,否则,回到状态1,重新等待“H”;

状态5:检测当前字符是否是“o”,如果是“o”,驱动led控制引脚发生状态翻转,同时回到状态1,等待下一个“H”的到来,否则,回到状态1,重新等待“H”;

代码实现:

module Hello(
	Clk,
	Rst_n,
	data,
	led
);
	input Clk;	//50M
	input Rst_n;	//低电平复位
	
	input [7:0]data;	//存储字符的ASCII码
	
	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)begin
	if(!Rst_n)begin
		led <= 1'b1;	//led低电平有效
		state <= CHECK_H;	//当复位时,等待H状态
	end
	else
		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 

语法知识:

localparam

在Verilog中,可以使用localparam(本地参数)来声明常量。

(注:parameter可用作在顶层模块中例化底层模块时传递参数的接口,localparam的作用域仅仅限于当前module,不能作为参数传递的接口。)

testbench文件代码如下:

`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);	//"+1"操作使ASCII信号与时钟信号上升沿不对齐,方便查看仿真结果
		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

语法知识:

forever 循环

forever 循环语法格式如下:

forever begin
    …
end

forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。forever 相当于

while(1) 。通常,forever 循环是和时序控制结构配合使用的。

标签:forever,FPGA,clock,Clk,period,状态机,006,Rst,ASCII
From: https://www.cnblogs.com/little55/p/17851843.html

相关文章

  • 基于CrossLink-NX FPGA的核心板电路设计
     引言FieldProgrammableGate Array(简称,FPGA)于1985年由XILINX创始人之一RossFreeman发明,第一颗FPGA芯片XC2064为XILINX所发明,FPGA一经发明,后续的发展速度之快,超出大多数人的想象,近些年的FPGA,始终引领先进的工艺。在通信等领域FPGA有着广泛的应用,通信领域需要高速的通信协......
  • FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别
    定义一个示例模组,代码如下:moduleblock_nonblock( Clk, Rst_n, a, b, c, out); inputClk; inputRst_n; inputa,b,c; outputreg[1:0]out; //out=a+b+c,out最大为3,所以设置为两位; //d=a+b; //out=d+c; reg[1:0]d;阻塞赋值:阻塞赋值1:......
  • FPGA入门笔记004——BCD计数器设计与使用
    1、设置一个最大值为10的四位计数器,Verilog代码如下:moduleBCD_Counter( Clk, Cin, Rst_n, Cout, q); inputClk; //计数器基准时钟 inputCin; //计数器进位输入 inputRst_n; //系统复位 // outputRegCout; //计数器进位输出 outputCout; //计数器进位输出 out......
  • FPGA入门笔记003——计数器IP核调用与验证
    FPGA设计方式主要有三种:1、原理图(不推荐);2、VerilogHDL设计方式;3、IP核输入方式计数器IP核调用与验证步骤如下:1、添加IP核文件打开QuartusII,新建一个项目,名称为counter_ip。选择Tools->MegaWizardPlug-InManager。选择第一个选项。在搜索栏中输入COUNTER,单击LPM_COU......
  • 洛谷 B2006 地球人口承载力估计(Python3)
    这题难点在理解题意。没有任何技术含量:(题目分析:1.“可持续发展”到底什么意思?Makeendsmeet.也就是说能养活的那些人一年消耗的等于地球一年产生的。2.题中为什么要给x,a,y,b?为了求等量关系。注意,这里"x 亿人生活 a 年,或供 y 亿人生活 b年"用的是地球新生的资源和原有......
  • FPGA和ZYNQ 开发平台
    FPGA,全称为Field-ProgrammableGateArray,即现场可编程门阵列,是一种FPGA,全称为Field-ProgrammableGateArray,即现场可编程门阵列,是一种数字集成电路。它是一种半定制电路,既能解决定制电路的不足,又克服了通用器件的缺点。FPGA的基本结构主要包括可编程输入/输出单元(I/O)、可编程逻......
  • # FPGA入门笔记002——译码器
    设计一个38译码器项目文件编写:modulemy3_8( a, b, c, out); inputa; //输入端口A inputb; //输入端口B inputc; //输入端口C outputreg[7:0]out; //输出端口 /* always块: '()'内部为敏感信号,当a、b、c有一个信号发生变化时,执行always块中的语句 凡是在al......
  • mysql链接不上3306报错10060
    1、控制台进入查看防火墙(前提mysql我的端口是3306,现在大部分人已经不用3306了)firewall-cmd--zone=public--list-ports(查看3306端口是否开启,如果没见到3306端口)2、添加3306firewall-cmd--zone=public--add-port=3306/tcp--parmanent3、如上添加成功了,最重要的一点来......
  • FPGA入门学习笔记001
    1、assignassign为连续赋值语句,通常用于组合逻辑电路,例如:assignled_out=(key_in==0)?a:b;2、timescale例如:`timescale1ns/1ps定义了一个仿真精度。'1ns'为仿真步进,例如设置100的延时'#100',则实际延时100*1ns。'1ps'为仿真精度,设定延时,可以精确到小数点后两位,例......
  • Unity-FSM有限状态机
    Unity-FSM有限状态机什么是有限状态机?​ 在编写一些需要判断多个条件的程序时,我们常常会用到if-else语句,这样能够很好的帮我们解决多数问题。但在游戏开发过程中,一个角色的行为不是一成不变的,需要实时的进行修改,此时如果我们使用的是if-else来判断角色所处状态,就需要修改整......