基于VHDL语言的状态机设计

news/2025/2/7 6:58:35/

基于VHDL语言的状态机(FSM)设计

状态机(Finite State Machine,FSM)

状态机的组成:如图所示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ur7YnvA2-1589528869675)(G:\研究生\FPGA课程\笔记文档\rec\091852508161862.jpg)]
状态机的种类:

  • Mealy型:当前状态、当前输入相关
  • Moore型:仅当前状态相关
  • VHDL代码结构:
  • 时序逻辑部分:process内部
  • 组合逻辑部分: 在使用FSM方式设计VHDL代码时,通常会在结构体的开始部分插入一个用户自定义的枚举数据类型,其中包含所有可能出现的电路状态。

设计风格1

一种结构清晰、易于实现的FSM设计风格:

  • FSM中的时序逻辑部分和组合逻辑部分分别独立设计;
  • 定义一个枚举数据类型,内部包含所有FSM需要的状态;

FSM中时序逻辑部分的设计特点:

  • 确定的输入/输出端口
  • 典型的模板可供使用
  • 标准的设计
  • 寄存器数目少:默认的编码方式下,log2n,N表示状态数,表现为位宽
------------lower section---------------
process (clock, reset)
beginif (reset = '1‘)  thenpr_state <= state0;elsif (clock’event and clock=‘1’)  thenpr_state <= nx_state;end if;
end process;

FSM中组合逻辑部分的设计特点:

  • 并发代码、顺序代码皆可;
  • 顺序代码方式的设计模板;
  • process的敏感信号列表;
  • 完整列出IN/OUT组合;
  • 无边沿赋值,无寄存器生成;
------------upper section---------------
process (input, pr_state)
begincase pr_state iswhen state0=>        //多个条件转移分支if  (input=...)  thenoutput <= <value>;nx_state<=state1;else  ....;end if;when  state1=>if  (input=...)  thenoutput <= <value>;nx_state<=state2;else  ....;end if;......end case;
end process;

状态机模板

library ieee;
use ieee.std_logic_1164.all;
entity <entity_name> isport (input: in <data_type>;reset, clock: in std_logic;output: out <data_type>);
end <entity_name>;
architecture <arch_name> of <entity_name> istype state is (state0, state1, state2, state3, ...);signal pr_state, nx_state: state;
begin
------------lower section---------------
process (clock, reset)
beginif (reset = '1')  thenpr_state <= state0;elsif (clock'event and clock='1') thenpr_state <= nx_state;end if;
end process;
------------upper section---------------
process (input, pr_state)
begincase pr_state iswhen state0=>if  (input=...)  thenoutput <= <value>;nx_state<=state1;else  ....;end if;when  state1=>if  (input=...)  thenoutput <= <value>;nx_state<=state2;else  ....;end if;......end case;
end process;
end <arch_name>

设计风格2

在很多应用中(如波形整齐、流水线技术等),需要同步的寄存器输出,即需先使用寄存器存储起来,然后在时钟边沿时才进行更新,如图b:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjchSWEY-1589528869682)(G:\研究生\FPGA课程\笔记文档\rec\图片5.png)]

状态机模板—(使用辅助信号如temp)

library ieee;
use ieee.std_logic_1164.all;
entity <entity_name> isport (input: in <data_type>;reset, clock: in std_logic;output: out <data_type>);
end <entity_name>;
architecture <arch_name> of <entity_name> istype state is (state0, state1, state2, state3, ...);signal pr_state, nx_state: state;signal temp: <data_type>;
begin
------------lower section---------------
process (clock, reset)
beginif (reset = '1')  thenpr_state <= state0;elsif (clock'event and clock='1') thenoutput<=temp;pr_state <= nx_state;end if;
end process;
------------upper section---------------
process (pr_state)      ----Mealy型状态机
begincase pr_state iswhen state0=>temp <= <value>;if (condition) then nx_state<=state1;....;end if;when  state1=>temp <= <value>;if  (condition)  then nx_state<=state2;....;end if;......end case;
end process;
end <arch_name>
--注:temp信号将输出结果存储起来,只有当所需时钟边沿到来时才被赋值给输出端口

软件说明:ModelSimSetup-13.1.0.162,QuartusSetup-13.1.0.162。

FSM功能描述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hx3dTING-1589528869687)(G:\研究生\FPGA课程\笔记文档\rec\图片3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6i3qEx4H-1589528869692)(G:\研究生\FPGA课程\笔记文档\rec\图片4.png)]

建立工程:

第一步:打开Quartus软件。

第二步:点击New Project Wizard -> next.

第三步:选择工程文件的存放位置,输入工程名 -> next -> next。

第四步:在family栏选择芯片型号-Cyclone IV E,在Name栏选择EP4CE115F29C7,选择完之后点击next。(如果不进行硬件调试时,此处默认即可)

第五步:检查工程有没有建错,点击完成。如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQ40yx2C-1589528869696)(G:\研究生\FPGA课程\笔记文档\rec\20161122122950778.png)]

程序设计:

状态机顶层文件设计(设计风格一):

--文件名:simple_fsm.vhd 应与工程名保持一致:
library ieee;
use ieee.std_logic_1164.all;
entity simple_fsm isport ( a, b, d, rst, clk: in BIT;x: out BIT);
end simple_fsm;
architecture Fsm of  simple_fsm istype state is (stateA, stateB);signal pr_state, nx_state: state;
begin
------------lower section---------------
process (clk, rst)
beginif (rst = '1')  thenpr_state <= stateA;elsif (clk'event and clk='1') thenpr_state <= nx_state;end if;
end process;
------------upper section---------------
process ( a, b, d, pr_state)    
begincase pr_state iswhen stateA=>x <=a;if (d='1') then nx_state<=stateB;else nx_state<=stateA;end if;             when  stateB=>x<=b;if (d='1') then nx_state<=stateA;else nx_state<=stateB;end if;end case;
end process;
end Fsm;

状态机顶层文件设计(设计风格二):

library ieee;
use ieee.std_logic_1164.all;
entity simple_fsm1 isport ( a, b, d, rst, clk: in BIT;x: out BIT);
end simple_fsm1;
architecture simple_fsm of  simple_fsm1 istype state is (stateA, stateB);signal pr_state, nx_state: state;signal temp: BIT;
begin
------------lower section---------------
process (clk, rst)
beginif (rst = '1')  thenpr_state <= stateA;elsif (clk'event and clk='1') thenpr_state <= nx_state;x<=temp;end if;
end process;------------upper section---------------
process ( a, b, d, pr_state)    
begincase pr_state iswhen stateA=>temp<=a;if (d='1') then nx_state<=stateB;else nx_state<=stateA;end if;             when  stateB=>temp<=b;if (d='1') then nx_state<=stateA;else nx_state<=stateB;end if;end case;
end process;
end simple_fsm;

文件仿真(这里采用modelsim仿真波形):

  1. 选择File-> New -> Verification/Debugging Files ->University Program VWF。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F4kPrYX2-1589528869700)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200423165155.png)]
    2.打开测试文件。(右键点击添加端口,对输入信号初始化,赋值。)

设计风格1:
在这里插入图片描述
设计风格2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgIBx05M-1589528869704)(G:\研究生\FPGA课程\笔记文档\rec\微信截图_20200515151822.png)]

3.仿真结果:

设计风格1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SyHULjIF-1589528869705)(G:\研究生\FPGA课程\笔记文档\rec\微信截图_20200515152217.png)]

设计风格2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1npq3uy-1589528869707)(G:\研究生\FPGA课程\笔记文档\rec\微信截图_20200515151859.png)]

逻辑电路图:

显示编译成功后,选择菜单栏 Tools –>Netlist Viewers –>RTL Viewer 显示逻辑电路图

设计风格1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbvMswG3-1589528869710)(G:\研究生\FPGA课程\笔记文档\rec\微信截图_20200515154440.png)]

设计风格2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjZXVLqy-1589528869712)(G:\研究生\FPGA课程\笔记文档\rec\微信截图_20200515154527.png)]


http://www.ppmy.cn/news/866360.html

相关文章

VHDL语言掌握——北京理工大学集成电路设计实践一

实验一&#xff1a;4通道分频器的设计 一、实验目的 &#xff08;1&#xff09;熟悉软件环境 &#xff08;2&#xff09;理解用VHDL进行设计综合的流程和方法 &#xff08;3&#xff09;掌握VHDL的代码结构及电路描述方法 &#xff08;4&#xff09;理解并行语句和顺序语句…

VHDL硬件描述语言(三)VHDL语言要素

一、文字规则 1.1 标识符 标识符主要用来为端口、信号、变量、子程序、常数和参数等命名。 其规则如下&#xff1a; 有效的字符&#xff1a;包括26个大小写英文字母&#xff0c;数字包括0&#xff5e;9 以及下划线“_”任何标识符必须以英文字母开头下划线“_”的前后必须有…

关于VHDL语言书写格式的学习(使用quartus Ⅱ)

本文并不是对VHDL的系统的讲解&#xff0c;而是我认为的关键部分&#xff0c;知道了这些&#xff0c;基本上可以使用VHDL语言进行一些相应的设计。并且在使用的过程中发现问题&#xff0c;再进行一些相应的检索&#xff0c;深入学习&#xff0c;最后达到精通。 首先要明白VHDL是…

vhdl计算机语言,vhdl语言编程实例.doc

vhdl语言编程实例 实现各种逻辑功能&#xff1a; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY louji1a IS PORT(S: IN STD_LOGIC_VECTOR(2 DOWNTO 0); C: IN STD_LOGIC; A: IN STD_LOGIC_VECTOR(4 DOWNTO 0); B: IN STD_LOGIC_VECTOR…

vhdl语言基础篇-for

1、for语法使用规则 标号:for 循环变量 in 离散范围 generate <并行语句>; end generate 标号; 代码示例如下&#xff1a; signal data_7p4bit : std_logic_vector(7*4-1 downto 0); signal data_7p_bit : std_logic_vector(6 downto 0); G_04deg : for I i…

VHDL语言基础-VHDL程序的基本结构与主要构件

目录 VHDL程序的基本结构&#xff1a; 一个完整的VHDL程序包括&#xff1a; Example&#xff1a; VHDL的主要构件&#xff1a; VHDL程序的基本构件&#xff1a; 主要构件&#xff1a; VHDL的主要构件—库&#xff1a; 使用格式&#xff1a; Example&#xff1a; VHDL的…

笔记:FPGA与VHDL语言学习1

FPGA与VHDL语言学习1 目录 1.EDA,fpga,asic 2.CPLD与FPGA 3.设计一个三选一FPGA程序 4.使用由半加器与全加器程序生成一个f_adder全加器图形模块。试用4个f_adder模块组成一个4位全加器。 5.4&#xff5e;16译码器 6.设计乘法器 1.EDA技术与ASIC设计和FPGA开发有什么关系&am…

vhdl计算机语言,八周造个CPU(1):VHDL语言的实现和仿真方法,简单PC模块的实现和仿真...

鄙系有一门很著名的课,《计算机组成原理》,教你三周造台计算机。我们组今年眼瞎,选了挑战性课程,也就是教你一学期造台32位MIPS架构的计算机。前段时间全组人都被软工和编译原理所困扰(实际上,今天是编译原理第二次大作业的deadline,但我还没做完,但是我仍然在这里悠闲地…