网站首页 > 基础教程 正文
引言
使用VHDL逻辑语言描述硬件电路实体,通常采用状态机描述电路的工作时序和状态变换。VHDL语言中描述状态转移的语言为if elsif ... end if 语句或 case X is ..... end case 语句。
状态机的关键点
输入条件、状态判断、输出结果
状态机分类
无限状态机(Infinite State Machine,ISM)和有限状态机(Finite State Machine,FSM)。顾名思义,无限状态机就是状态数无限;有限状态机就是状态数有限。逻辑状态的设计一般是有限状态的。状态机也根据信号输出方式来进行划分,比如输出仅和当前状态有关的为同步输出状态及(Moor 型),其输入的变换需要等待时钟信号的到来。Mealy型属于异步输出状态机,其输出是当前状态和所有输入信号的函数,其输出是在输入之后立即发生的。通常使用的状态机描述方法是Moor 有限状态机。
Moor有限状态机
通常Moor有限状态机的描述方法有三种:1. 一段式状态机描述方法(条件判断、状态转移、输出同时完成);2. 二段式状态机描述方法(条件判断、状态转移为一段;输出为另外一段);3. 三段式状态机描述方法(状态存储一段-时序逻辑;状态转移一段-时序逻辑;结果输出-组合逻辑)。
三种描述方法各有优劣,一段式状态机描述符合广大逻辑工程师常规思维,语言简洁,但是时序逻辑和组合逻辑混合在一起,不容易维护,不容易优化时序。二段式描述介于一段和三段之间,时序逻辑和组合逻辑分开,语言描述更清晰,容易维护。三段式描述符合状态底层实现方式,编译器更容易识别和综合。
三种描述方法的模板
通常状态机描述定义状态常量,在VHDL语言描述状态常量通常常用枚举类型,eg
type states is (zero,one,two,three,four,five,six,seven,eight,nine,ten); 或
constant zero:std_logic_vector(3 downto 0):=x"0";
.......
constant ten :std_logic_vector(3 downto 0):=x"a";
在verilog 语言描述状态常量可以定义参数,eg
//状态声明和状态编码
reg [3:0] state;
parameter [3:0] S0=4'b0000;
parameter [3:0] S1=4'b0001;
parameter [3:0] S2=2'b0010;
parameter [3:0] S3=2'b0011;
VHDL 语言状态机描述模板
在使用VHDL描述状态机时,通常从状态机的三个基本模块入手,可以分为一段式、二段式和三段式FSM描述方法,有的地方也称为单进程、两进程和三进程FMS描述方法。
一段式状态机描述
状态机的三个模块合并起来,写到一个进程里面,在该进程中描述状态转移,又描述状态的输入和输出。
二段式状态机描述
用2个进程来描述状态机,其中当前状态寄存器用一个同步时序进程来描述,用另外一个组合逻辑进程来描述输出逻辑和次状态合并起来。
- 状态转移
- 判断输出
三段式状态机描述
状态机的三个模块分别用三个进程来描述,一个同步时序进程描述状态寄存器,一个组合逻辑进程描述次状态状态逻辑,最后输出逻辑单独用一个进程来描述。
典型三状态机描述程序框架如下:
定义两个状态:当前状态和下一状态
type states is (zero, one, two, three,four,five,six,seven,eight,nine,ten);
signal current_state , next_state: states
进程一: 同步时序进程描述状态寄存器
process(rst_n,clk)
begin
if ( rst_n='0') then
current_state<=zero;
elsif clk'event and clk='1' then
current_state<=next_state;
end if;
end process;
该进程表达语句简单,对当前状态变量进行初始化,然后时钟沿获取下一状态值。
进程二:描述次状态逻辑的进程
process(current_state, 其他输入信号)
begin
next_state<=current_state;
case current_state is
when state1=>
-----
next_state<=某个状态;
------
when state2=>
------
end case;
end process;
进程2根据输入信号进行条件判断,然后对当前状态进行改变。
进程三:描述输出逻辑的进程
process(current_state, 其他输入信号)
begin
output<=默认值;
case current_state is
when state1=>
-----
output<=xxx;
------
when state2=>
------
output<=xxx;
------
end case;
end process;
三种状态机描述方法通常推荐采用二段式或三段式,不建议采用一段式描述。一段式描述代码风格——编码自由程度高,规范性差,代码的可靠性和可维护程度低,不利于时序约束和综合的布局布线。两段式描述代码相对一段和三段式而言,代码简洁程度高,代码可靠性较高。总的说来,三段式代码的可靠性最高的。优先推荐采用三段式描述状态机,然后二段式,不推荐采用一段式描述。
猜你喜欢
- 2024-10-31 硬件描述语言 硬件描述语言verilog
- 2024-10-31 verilog快速入门之例五 verilog从入门到精通
- 2024-10-31 verilog实例(五) verilog技巧
- 2024-10-31 大规模数模混合电路建模验证分析:理论,方法,工具
- 2024-10-31 国内芯片人才培养问题凸显,IC修真院到底在教什么?
- 2024-10-31 Hello FPGA! Verilog的语法1 fpga hello world
- 2024-10-31 终于讲清楚了,看完这篇你也可以设计CPU了
- 2024-10-31 verilog实例(四) verilog程序实例
- 2024-10-31 你真的理解Verilog 中的module吗?
- 2024-10-31 「课程上新5.9折」Verilog基础与典型数字电路的设计
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)