基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(13)——第12章

学习:

  1. 时钟同步的状态机结构(Mealy 状态机)(时序逻辑的输出补单取决于状态还取决于输入)——P 166
    所有的触发器的时钟端都连接在一个共同的时钟信号上,所以改变只可能发生在时钟的跳变沿上
  2. 时序逻辑电路的输出只取决于当前状态,称为 Moore 状态机(附有状态机结构图)——P 167
  3. 状态转移图
    一款用于绘制状态机转换图和流程图的web在线绘图工具 - 垒土毫末 - 博客园 (cnblogs.com)
    (33条消息) 有限状态机_沧海一渔的博客-CSDN博客
  4. 二进制码、独热码、格雷码
    (33条消息) FPGA学习笔记---二进制码、独热码、格雷码分析对比_独热码和二进制码_嵌入式@hxydj的博客-CSDN博客

思考题:

  1. 举例说明状态分配对状态机电路的复杂度和速度的影响。
    例 12.2 与 12.1 的状态分配不同,例 12.2 采用独热编码而例 12.1 则采用 Gray 编码,究竟采用哪一种编码好看看 1 具体情况而定。对于用 FBGA 实现的有限状态机建议采用独热码, 因为虽然独热编码多用了两个触发器,但所用组合电路可省些, 因而使用电路的速度和可靠性有显著提高,而总的单元数并无显著增加. 采用独热编码后有了多余的状态,就有一些不可到达的状态,为此可以用默认项表示不可达到的状态。

  2. 分别说明和解释[例12.1]~[例12.4]中两种不同赋值(即非阻塞赋值“≤=”和阻塞赋值“=”)的用法,和逻辑关系等号“ == ”的含义。
    例 12.1 用“<=”赋值,表示在过程块结束以后才进行赋值是并行结构。例 12.4 用“=”赋值,表示是立即进行赋值是顺序结构。两个例子中作用是一样的,例 12.4 用了多个 always 块,而例 12.1 只用到了一个 always 块,故两种赋值的方式才会不一样。逻辑关系符号“m”是表示判断的符号,用到判断信号是否为符合条件的信号, 如 if (a 2’b 10)则表示 a 是否为 2’b10。

  3. 一般情况下状态机中的状态变量是用来干什么的?是否可以把状态变量中的某些位指定为状态机的输出,直接用来控制逻辑开关?这样做有什么好处?有什么缺点?
    用来表示状态机的几种状态,可以用来对不同状态进行转换,可以直接把状态变量中的某位指定为状态机的输出,直接用来控制逻辑开关。这样做可以提高输出信号的开关速度并节省电路器件。但这种方法的缺点就是开关的维持时间必须与状态机的时间一致。

  4. 分析[例12.1]~[例12.4]中用 Verilog 编写的状态机模块。经综合后产生的电路结构中,哪个属于 Mealy 状态机?哪个属于 Moore 状态机?请在认真分析及综合出来的电路结构后,给出正确的答案。
    从综合后产生的电路结构,可知例12.1,例12.2都属于 Mealy 状态机而例12.3,例12.4属于 Moore 状态机。

  5. 如果需要设计带流水线输出的 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	  
    
  6. 在状态机的测试模块中,最后面的 initial 块语句有什么作用,若测试模块中没有最后的 initial 语句块能不能进行仿真?如果能,需要注意什么?本测试模块还有什么地方没有测试到?应该如何改进?
    和其它模块一起有并行的作用,起到是仿真结束的作用。若测试模块中没有最后的 initial语句能进行仿真。需要注意仿真是各个信号要对应所测试的模块。本测试模块没有测试到当状态不属于四个状态时,将会怎样。在初始化时可以先将reset信号为高阻或xx而后再按照该测试模块进行仿真。

posted @ 2023-06-02 14:42  江左子固  阅读(55)  评论(0编辑  收藏  举报