Vhdl 我的速度下降了,我错过了什么?

Vhdl 我的速度下降了,我错过了什么?,vhdl,fsm,Vhdl,Fsm,我为CRC设计了2个FSM。我从一个在线CRC生成器中得到了基代码(xor树),并围绕它构建了FSM,一个用于发送,一个用于接收。它工作得很好。当我单独测试其中一个时,我得到了200+MHz的速度。当我尝试背靠背测试它们时,我的速度显著下降(低于150 MHz)。当我将它们包括在带有UART链路的更大设计中时,它会下降得更低(110 MHz)。 我想我错过了一些非常重要的东西,但不知道是什么。你…吗? 我已经包括了Tx的代码。Rx非常相似。更准确地说,当它们都被测试时,限制因素是,从帧到输出(T

我为CRC设计了2个FSM。我从一个在线CRC生成器中得到了基代码(xor树),并围绕它构建了FSM,一个用于发送,一个用于接收。它工作得很好。当我单独测试其中一个时,我得到了200+MHz的速度。当我尝试背靠背测试它们时,我的速度显著下降(低于150 MHz)。当我将它们包括在带有UART链路的更大设计中时,它会下降得更低(110 MHz)。 我想我错过了一些非常重要的东西,但不知道是什么。你…吗? 我已经包括了Tx的代码。Rx非常相似。更准确地说,当它们都被测试时,限制因素是,从帧到输出(Tx)到当前状态(Rx)。 我还应该说,我最近开始使用vhdl,所以请指出我在下面的设计中犯的任何愚蠢的错误。 (注:FSM状态向量编码是另一个讨论,但任何输入都将非常受欢迎)

IEEE库;
使用IEEE.std_logic_1164.all;
使用ieee.numeric_std.all;
实体附加\u发送\u FSM为
港口(
时钟:标准逻辑中;--系统时钟
RESETn:在标准逻辑中;--全局重置
追加CRC:在标准逻辑中;--输入标志
TX_FRAME_NO_CRC:标准逻辑向量(39向下至0);--40位输入帧以附加CRC
附加CRC\u:输出标准逻辑;--输出标志
TX_帧:输出标准逻辑向量(47向下至0)--48位输出帧
);
终端附加(发送)(FSM);;
--------------------------------------------------------------------------------
Append_Tx_FSM的架构是
--------------------------------------------------------------------------------
--有限状态机声明
--------------------------------------------------------------------------------
类型状态为(空闲、延迟、crc、结果)
信号电流,下一个:状态;
属性syn_编码:字符串;
电流的属性同步编码:信号为“灰色”;
--属性syn_state_machine:布尔值;
--当前发送的属性syn_state_机器:信号为假;
--状态向量
信号crc_结果_tx:std_逻辑_矢量(7到0);--用于crc计算的信号
信号最后附加:标准逻辑;——输入标志最后一个值的信号
信号帧到附加:标准逻辑向量(39向下到0);--框架结构施工信号
信号帧到输出:标准逻辑向量(47向下至0);--输出信号
附加信号\u crc:std\u逻辑;——输出信号
--------------------------------------------------------------------------------
开始
--------------------------------------------------------------------------------  
--输入数据(39:0)多项式(1+x^1+x^2+x^3+x^5+x^8)的CRC计算(0x97)
--------------------------------------------------------------------------------
CRC_结果_发送(0)
当我尝试背靠背测试它们时,我的速度显著下降(低于150 MHz)。

更准确地说,当它们都被测试时,限制因素是,从帧到输出(Tx)到当前状态(Rx)

由此,我暗示您所说的“背靠背”测试是指将Tx输出连接到Rx输入。如上所述,您需要查看TX和Rx之间附加的
CRC\u
TX\u帧
路径: -
TX\u帧
(TX输出)在TX块的输出上注册。我假设它直接进入Rx中的CRC解码器。这条路径无法再重新管道化。 -
CRC\u追加
直接来自于OuStDecode\u Tx Mux,即组合逻辑。尝试从同步进程生成附加的
CRC\u

p_crc_appended : process (CLK, RESETn)  
begin  
   if(RESETn = 0) then
      CRC_APPENDED <= '0';
   elsif (rising_edge(CLK)) then  
      CRC_APPENDED <= appended_crc;  
   end if;  
end process;
p_crc_追加:进程(CLK,重置)
开始
如果(RESETn=0),则

附加CRC_的静态时序分析将告诉您最慢的路径。重写或重新管道。要详细说明@BrianDrummond的建议,请尝试注册两个组件(RX和TX)之间的信号。我猜这将是CRC_附加和TX_帧信号。这将使工具有更多的时间来满足传播延迟和设置时间,并有助于实现更快的速度。顺便说一句,当你说“当我自己测试任何一个…”时,你指的是我假设的合成工具的结果?“当我自己测试任何一个…”时,我的意思是布局后sim正常,布局给我200+MHz的速度。不仅在合成过程中。我有关于注册输入和输出的red,但不知道如何实现。TX_帧输出来自内部信号帧到帧输出。该内部信号处于时钟过程中。这不是让我的输出注册了吗?嗨,谢谢你的信息。我稍微改变了设计。我仍然使用FSM(带记录)并控制被动crc。(这里贴的代码我认为它是活动CRC)。有记录的fsm肯定会记录所有输出,所以我的速度损失消失了。尽管如此,有一件事我还是不明白,“TX_帧输出,来自内部信号帧到帧输出。该内部信号处于时钟过程中。这不使我的输出注册吗?”。是的,输出
TX_帧
确实注册了,因为注册过程的输出(即FF输出)之间没有逻辑和实体端口<代码>附加的CRC\u
未注册,可能导致在将Tx连接到Rx时出现计时问题。
p_crc_appended : process (CLK, RESETn)  
begin  
   if(RESETn = 0) then
      CRC_APPENDED <= '0';
   elsif (rising_edge(CLK)) then  
      CRC_APPENDED <= appended_crc;  
   end if;  
end process;