有限状态机
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态
所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向
哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。(这里指的是米里Mealy型有限状态
机,而莫尔Moore型有限状态机究竟转向哪一状态只决于当前状态。)

采用独热码实现的有限状态机。采用了独热编码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。

 module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [:] state ;
parameter Idle = ’b1000,
Start = ’b0100,
Stop = ’b0010,
Clear = ’b0001;
always @(posedge clock)
if (!Reset)
begin
state <= Idle; F<=; G<=;
end
else
case (state)
Idle: begin
if (A) begin
state <= Start;
G<=;
end
else state <= Idle;
end
Start: if (!A) state <= Stop;
else state <= Start;
Stop: begin
if (A) begin
state <= Clear;
F <= ;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=; G<=;
end
else state <= Clear;
end
default: state <=Idle;
endcase
endmodule

用always语句和连续赋值语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。

 module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G; reg [:] state ;
wire [:] Nextstate;
parameter Idle = ’b00,
Start = ’b01,
Stop = ’b10,
Clear = ’b11; always @(posedge Clock)
begin
if (!Reset)
begin
state <= Idle;
end
else
state <= Nextstate;
end assign Nextstate = ( state == Idle ) ? ( A ? Start : Idle ) :
( state==Start ) ? ( !A ? Stop : Start ) :
( state== Stop ) ? ( A ? Clear : Stop ) :
( state== Clear) ? ( !A ? Idle : Clear) :
Idle;
assign F = (( state == Stop) && A );
assign G = (( state == Clear) && (!A || !Reset)); endmodule

用沿触发的always语句和电平敏感的always语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。

 module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G; reg [:] state, Nextstate;
parameter Idle = ’b00,
Start = ’b01,
Stop = ’b10,
Clear = ’b11; always @(posedge Clock)
begin
if (!Reset)
begin
state <= Idle;
end
else
state <= Nextstate;
end always @( state or A )
begin
F=;
G=;
if (state == Idle)
begin
if (A)
Nextstate = Start;
else
Nextstate = Idle;
G=;
end
else
if (state == Start)
if (!A)
Nextstate = Stop;
else
Nextstate = Start;
else
if (state == Stop)
if (A)
Nextstate = Clear;
else
Nextstate = Stop;
else
if (state == Clear)
begin
if (!A)
Nextstate = Idle;
else
Nextstate = Clear;
F=;
end
else
Nextstate= Idle;
end
end
endmodule

状态必须明确赋值,通常使用参数(parameters)或宏定义(define)语句加上赋值语句来实现。

原则 1:时序电路建模时,用非阻塞赋值。
原则 2:锁存器电路建模时,用非阻塞赋值。
原则 3:用always 块写组合逻辑时,采用阻塞赋值。
原则 4:在同一个always 块中同时建立时序和组合逻辑电路时,用非阻塞赋值。
原则 5:在同一个always 块中不要同时使用非阻塞赋值和阻塞赋值。
原则 6:不要在多个always 块中为同一个变量赋值。

Verilog笔记.3.有限状态机的更多相关文章

  1. Verilog笔记——Verilog数字系统设计(第二版)夏宇闻

    本片记录Verilog学习笔记,主要是和以往用的C语言的不同之处,以例子.代码的形式记录.学习以<Verilog数字系统设计>(第二版)为参考资料,援助作者夏宇闻. 1. C语言和Veri ...

  2. Verilog笔记.2.数字逻辑电路

    1.数字逻辑电路的种类:1) 组合逻辑:输出只是当前输入逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路.也就是说,当输入信号中的任何一个发生变化时,输出都有可能会根据其变化而变化,但与电路目 ...

  3. Verilog笔记.1.基本语法

    0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...

  4. [笔记][FPGA]有限状态机FSM学习笔记(三)

    0. 简介 在数电FPGA中,FSM是一个重要的部分,藉此可以完成一些复杂算法的硬件实现等.其中有关于FSM的写法按照always块的个数来划分,又分为一段式.两段式.三段式状态机.顾名思义,一段式就 ...

  5. 自学FPGA笔记之 “有限状态机”

    “有限状态机”,一份好的代码必需掌握的技能. 首先状态机需要分清楚一共有多少种状态,其次画出状态图,状态图根据需求来画,尽可能的细分画到每一个状态,如有需要用到状态机一定要画出状态图,一定要画出状态图 ...

  6. Verilog笔记——YUV2RGB的模块测试

    1 YUV2RGB的模块如下: module yuv2rgb( clk, //时钟输入 rstn, //复位输入,低电平复位 y_in, //变换前Y分量输出 cb_in, //变换前Cb分量输出 c ...

  7. Verilog笔记.三段式状态机

    之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了. 所以就开始着手三段式状态机. 组合逻辑与时序逻辑分开,这样就能简单许多了. 但是两者在思考方式上也有着很大的区别. 三段式,分作: ...

  8. Verilog笔记.6.FIFO

    FIFO,First In First Out ,是一种先进先出的数据缓存器. 没有外部读写地址线,只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成. 不能像普通存储器那样可以 ...

  9. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

随机推荐

  1. SpringCloud——服务网关

    1.背景 上篇博客<SpringCloud--Eureka服务注册和发现>中介绍了注册中心Eureka.服务提供者和服务消费者.这篇博客我们将介绍服务网关. 图(1) 未使用服务网关的做法 ...

  2. 有道云笔记web版本居然不支持火狐

    好尴尬的火狐呀....

  3. 第187天:js基础---常见的Bom对象

    BOM(Browser Object Mode)浏览器对象模型,是Javascript的重要组成部分.它提供了一系列对象用于与浏览器窗口进行交互,这些对象通常统称为BOM. 一张图了解一下先 1.wi ...

  4. 【Python】tuple and list 练习

    Tuple: 1.       __add__ a = (,,,,,,,,,) b = (,,,,,,,), c = (,,,,), result = a.__add__(b) print(resul ...

  5. 怎样搭建一个自有域名的 WORDPRESS 博客?

    博客搭建并不复杂,只是过程有点繁琐,适合喜欢折腾的人,主要有下面几个步骤: 新建一个博客文件 购买域名(Domain Name) 注册一个主机空间(Web Host) 域名解析(DNSPod) 安装W ...

  6. 如何实现密码输入框focus状态弹出提示信息

    一.密码输入提示框样式实现 效果图如下: 源码如下: <html> <style type="text/css"> *{ padding: 0; margi ...

  7. [洛谷P1642]规划

    题目大意:有一棵$n(n\leqslant100)$个点的树,每个点有两个权值$a,b$,要求选择一个$m$个点的连通块$S$,最大化$\dfrac{\sum\limits_{i\in S}a_i}{ ...

  8. 洛谷U14667 肝活动【比赛】 【状压dp】

    题目描述 Yume 最近在玩一个名为<LoveLive! School idol festival>的音乐游戏.他之所以喜欢上这个游戏,是因为这个游戏对非洲人十分友好,即便你脸黑到抽不出好 ...

  9. SVN跨服务器自动更新--实现文件分发

    目标:SVN版本库提交,服务器中的工作拷贝能自动update. 实现方法:subversion, curl,php脚本实现,并且入mysql库来进行管理.改hosts文件来进行访问!提交触发钩子脚本时 ...

  10. 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed

    1. 在Oracle官网(http://www.oracle.com/technetwork/topics/winsoft-085727.html)下载文件: instantclient-basic- ...