11.1.4 基于算法状态机(ASM)图的设计 1. 算法状态机图
算法状态机图是时序状态机功能的一种抽象,是模拟其行为的关键工具,类似于软件流程图。但是显示的是计算动作的时间顺序,以及在状态机输入影响下发生的时序步骤。ASM图描述的是状态机的行为动作,而不是存储组件所存储的内容。
在描述时序状态机的行为方面,以及设计状态机来控制数据信道方面,ASM图是非常有用的。ASM图由如图11-9所示的基本元素组成:状态框、条件输出或寄存器操作框及判决框。
ASM图的基本单元是ASM块,如图11-10所示。它包含一个状态框、一个可选的判决框和在分支信道上放置的条件框。ASM块图等同于状态机的时序。对一个给定的ASM图,用状态转移图也可以表示同样的信息。
两种类型的状态机(米利型和摩尔型)都可以用ASM图表示。摩尔型状态机的输出常常在状态框中列出。条件输出放置在条件框中,条件框中还可以表示状态转移时的寄存器操作。在数据信道中的判决框隐含了优先权解碼。
2. 算法状态机和数据信道图
状态机的一个重要应用就是控制时序状态机数据信道上的寄存器操作,而该时序状态机已被划分为控制器和数据信道。控制器可以用ASM图来描述,然后将ASM图连接到所控制的数据信道上。当控制器的状态沿着通道发生转移时,通过标注每个通道来指出那些在相关数据信道单元中所发生的寄存器操作。以这种方式连接到数据信道的ASM图,就称为算法状态机和数据信道(Algorithm State Machine and Datapath,ASMD)图。
通过把时序状态机数据信道的设计从控制器的设计中分离出来,并在两个单元之间保持清晰的联系,使得ASMD图能够阐明时序状态机的设计方法。与状态转移并行发生的寄存器操作是在图的通道上标注的,而不是在通道上的条件框中标注的。
下面通过一个具体的实例,来展示基于ASMD图的时序状态机的设计。该实例是一个并行输入和输出的二级流水线2:1抽取器。该简单功能的抽取器用于数字信号处理,可以实现把数据从高速时钟率降到低速时钟率。2:1抽取器的实现框图如图11-11所示,整个数据字能以流水线内容填充到内存的速率或者以某些处理器速率的2倍速率传送到流水线。
图11-12给出了二级流水线2:1抽取器的ASMD图。状态机具有同步复位到空闲状态S_IDLE功能,一旦En信号有效则状态机从S_IDLE状态转到S_1状态,同时将数据加载到移位寄存器{P1,P0}中。在下一个时钟周期,状态机进入S_FULL状态。然后等待Load信号,一旦有效则将输入数据加载到移位寄存器中,同时状态机转到S_1状态。
基于ASMD图的二级流水线2:1抽取器程序代码如下所示,仿真波形见如图11-13所示。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
module decimator(clk, rst, En, Load, Data, Dout); parameter S_IDLE = 2'b00, S_1 = 2'b01, S_FULL = 2'b10, S_WAIT = 2'b11;
input clk, rst, En, Load; input [7:0] Data; output[7:0] Dout;
reg [7:0] P0, P1, Dout; reg [1:0] state;
always @(posedge clk)begin if(rst)begin state <= S_IDLE; P1 <= 8'h00; P0 <= 8'h00;
18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61.
end
else case(state) S_IDLE:if(En) begin state <= S_1; P1 <= Data; P0 <= P1; end
S_1: begin state <= S_FULL; P1 <= Data; P0 <= P1; end
S_FULL:if(Load) begin if(En)begin state <= S_1; P1 <= 8'h00; P0 <= 8'h00; end else begin state <= S_IDLE; P1 <= 8'h00; P0 <= 8'h00; end
Dout <= P0; end else begin state <= S_WAIT; end S_WAIT:if(Load) begin if(En)begin state <= S_1; P1 <= Data; P0 <= P1; end else begin state <= S_IDLE; P1 <= 8'h00; P0 <= 8'h00; end
Dout <= P0; end
default: begin state <= S_IDLE; P1 <= 8'h00;
62. 63. 64. 65. 66. 67. P0 <= 8'h00; end
endcase end
endmodule