一位同学反映,他设计的状态机使用Synplify综合和XST(Xilinx Synthesis Technology,是Xilinx ISE内嵌的综合工具)综合的结果不一致。对Synplify的综合结果布局布线后上板调试完全正确;而对XST的综合结果布局布线后上板调试发现了错误。所以他认为XST的综合结果有误,并询问为什么XST会综合出错误的结果。在帮助他解决这个疑问后,发现其中涉及的许多问题很具代表性,所以和大家一起分析一下这个疑问,希望对朋友们的设计有参考价值。下面是这位同学设计的状态机源代码: module RxState (Reset_b,RxClk,Rx4bit,RxDV,CurrentState); //port declare input Reset_b,RxClk,RxDV; input [3:0] Rx4bit;
output [2:0] CurrentState; // wire declare wire RXDEQD = Rx4bit == 4'hd; wire RXDEQ5 = Rx4bit == 4'h5; parameter [2:0] IDLE = 3'H0, PREAMBLE = 3'H1, SFD = 3'H2, DATA0 = 3'H3, DATA1 = 3'H4, DROP = 3'H5; // Rx State machine reg [2:0] CurrentState,NextState; always @( posedge RxClk or negedge Reset_b) begin if(!Reset_b) CurrentState <= DROP; else CurrentState <= NextState; end always @( CurrentState or RxDV or RXDEQ5 or RXDEQD) begin case(CurrentState) IDLE : if(RxDV ) NextState <= PREAMBLE; PREAMBLE: if(RXDEQ5) NextState <= SFD; SFD : begin if(RXDEQD) NextState <= DATA0; end DATA0 : NextState <= DATA1; DATA1 : begin NextState <= DATA0; if(!RxDV) NextState <= IDLE; end DROP : if(!RxDV) NextState <= IDLE; default : NextState <= IDLE; endcase end endmodule 其设计是一个数据通讯中同步接收装置的状态机,当“Reset_b”复位后,进入“DROP”状 态;当接收指示信号“RXDV”有效后,从“IDLE”状态进入接收前缀信号状态“PREAMBLE”;当控制信号“RxDEQ5”有效后进入“SFD”状态接收一些指示关键字;当控制信号“RxDEQ”有效时,进入数据接收状态“DATA0”;接收完“DATA0”后接收“DATA1”,直到接收指示信号“RxDV”无效,返回到“IDLE”状态。
[此贴子已经被作者于2008-1-18 17:41:28编辑过] |