基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(13)——第12章
学习:
- 时钟同步的状态机结构(Mealy 状态机)(时序逻辑的输出补单取决于状态还取决于输入)——P 166
所有的触发器的时钟端都连接在一个共同的时钟信号上,所以改变只可能发生在时钟的跳变沿上 - 时序逻辑电路的输出只取决于当前状态,称为 Moore 状态机(附有状态机结构图)——P 167
- 状态转移图
一款用于绘制状态机转换图和流程图的web在线绘图工具 - 垒土毫末 - 博客园 (cnblogs.com)
(33条消息) 有限状态机_沧海一渔的博客-CSDN博客 - 二进制码、独热码、格雷码
(33条消息) FPGA学习笔记---二进制码、独热码、格雷码分析对比_独热码和二进制码_嵌入式@hxydj的博客-CSDN博客
思考题:
-
举例说明状态分配对状态机电路的复杂度和速度的影响。
例 12.2 与 12.1 的状态分配不同,例 12.2 采用独热编码而例 12.1 则采用 Gray 编码,究竟采用哪一种编码好看看 1 具体情况而定。对于用 FBGA 实现的有限状态机建议采用独热码, 因为虽然独热编码多用了两个触发器,但所用组合电路可省些, 因而使用电路的速度和可靠性有显著提高,而总的单元数并无显著增加. 采用独热编码后有了多余的状态,就有一些不可到达的状态,为此可以用默认项表示不可达到的状态。 -
分别说明和解释[例12.1]~[例12.4]中两种不同赋值(即非阻塞赋值“≤=”和阻塞赋值“=”)的用法,和逻辑关系等号“ == ”的含义。
例 12.1 用“<=”赋值,表示在过程块结束以后才进行赋值是并行结构。例 12.4 用“=”赋值,表示是立即进行赋值是顺序结构。两个例子中作用是一样的,例 12.4 用了多个 always 块,而例 12.1 只用到了一个 always 块,故两种赋值的方式才会不一样。逻辑关系符号“m”是表示判断的符号,用到判断信号是否为符合条件的信号, 如 if (a 2’b 10)则表示 a 是否为 2’b10。 -
一般情况下状态机中的状态变量是用来干什么的?是否可以把状态变量中的某些位指定为状态机的输出,直接用来控制逻辑开关?这样做有什么好处?有什么缺点?
用来表示状态机的几种状态,可以用来对不同状态进行转换,可以直接把状态变量中的某位指定为状态机的输出,直接用来控制逻辑开关。这样做可以提高输出信号的开关速度并节省电路器件。但这种方法的缺点就是开关的维持时间必须与状态机的时间一致。 -
分析[例12.1]~[例12.4]中用 Verilog 编写的状态机模块。经综合后产生的电路结构中,哪个属于 Mealy 状态机?哪个属于 Moore 状态机?请在认真分析及综合出来的电路结构后,给出正确的答案。
从综合后产生的电路结构,可知例12.1,例12.2都属于 Mealy 状态机而例12.3,例12.4属于 Moore 状态机。 -
如果需要设计带流水线输出的 Mealy 状态机﹐其 Verilog 模块应该如何编写?请您编写一下,并通过综合器产生电路结构,分析其电路结构和时序。
Module fsm (clock, reset, a, k 2, k 1);
Input clock, reset, a;
Output k 1, k 2;
Reg k 1, k 2;
reg[3:0] state;
Parameter idle = 4'b 1000,
Start = 4'b 0100,
Stop = 4'b 0010,
Clear = 4'b 0001,
Always@(posedge clock)if(!reset) begin state<=idle; k2<=0; k1<=0; end else case(state) idle: if(a) begin state<=start; k1<=0; end else begin state<=idle; k2<=0; k1<=0; end else begin state<=idle; k2<=0; k1<=0; end start: if(!a) state<=stop; else state<=start; stop: if(a) begin state<=clear; k2<=1; end else begin state<=stop; k2<=0; k1<=0; end clear: if(a) begin state<=idle; k2<=0; k1<=1; end else begin state<=clear; k2<=0; k1<=0; end default: state<=idle; endcase Endmodule
-
在状态机的测试模块中,最后面的 initial 块语句有什么作用,若测试模块中没有最后的 initial 语句块能不能进行仿真?如果能,需要注意什么?本测试模块还有什么地方没有测试到?应该如何改进?
和其它模块一起有并行的作用,起到是仿真结束的作用。若测试模块中没有最后的 initial语句能进行仿真。需要注意仿真是各个信号要对应所测试的模块。本测试模块没有测试到当状态不属于四个状态时,将会怎样。在初始化时可以先将reset信号为高阻或xx而后再按照该测试模块进行仿真。