状态机的状态转换是在SCL下降沿后第4个时钟周期进行的。但是,停止信号出现后 总线被释放,SCL、SDA均为高电平,除非再出现起始信号进行数据传送,SCL是不会再 出现下降沿的。如果停止信号出现后就把空闲状态赋给next_state,将没有SCL时钟下降 沿做时间基准完成状态转化(即状态机进入到空闲状态)。为了解决矛盾,需要将停止信号 看作复位信号。一旦有停止信号出现,当前状态在下一个CLK脉冲强制进入到空闲状态,而 不能等到SCL下降沿后第4个时钟脉冲。 ack_rx_subaddr状态之后,master既可能发送数据又可能发送重复停止信号或者停 止信号,如何区分是哪种情况成为正确进入相应的状态的关键。最好的办法是 ack_rx_subaddr状态之后无条件紧跟rx_data状态。这样,如果在rx_data状态时检测到 重复起始信号,丢弃已接收的数据,并在$CL时钟下降沿后第4个时钟周期进行状态转化 进入rx_address状态,,否则继续完成接收数据。若发现停止信号,处理如前所述。这样 做既满足设计要求又不会增加多余的状态。 master收到数据后没有响应(SDA=1)表示这是master接收的最后一个字节数据。在 这种情况下,可以在SCL时钟下降沿后第4个时钟周期就直接进入到空闲状态,处理接下 来应该出现的重复起始信号或停止信号。 3.3子模块 3.3.1起始/停止信号、SCL检测 在高速时钟的上升沿采样SDA、SCL,如果在前后两个采样点发现SDA从“1”变化 到“0”而SCL保持“1”则认为master发出起始信号,将detect_.start置为有效。同 理,若发现SDA从“0”变化到“1”而SCL保持“1”,则认为是停止信号,将detect_.stop 置为有效。Detect_start有效保持一个状态周期,detect_stop有效保持一个时钟周期,以 避免误操作。 依靠SCL时钟下降沿进行状态转换以及在SCL时钟上升沿将SDA的数据送入移位寄存 器,时间有些仓促,因此决定推迟若干个c1k时钟周期进行。最简单的实现办法是将SCL 延时若干个时钟周期,再采样检测延时后的SCL的下降沿和上升沿分别作为状态转换和数 据采样时刻。 3.3.2移位寄存器 移位寄存器在rx_address、rx_subaddress、rx_data状态完成在数据采样时刻(SDA 数据有效时)对slave地址、寄存器子地址、数据的移位接收,接收完毕在响应状态将数据 并行送往指定的寄存器:在ack_tx_data状态和ack_rx_address状态且读写控制位为高 (r/w=l)时,并行输入数据,在tx_data状态发送时刻有效时输出最高位,在数据采样时刻 有效时进行移位操作。 3.3.3寄存器子地址寄存器、计数器寄存器 寄存器子地址寄存器实现完成对寄存器一次读写操作后地址自动增加的功能,这样 10 uvwuvØðF f ëñ?Á n B>?@8%ò¡¢? ¡A f < e s9÷-ÏÛÜ7¡¢8«¬w f Ü ëñ%ÚÛ¡¢?×qruvóô õzîüïüyüz ¥ÓÄ f B>ë ñöBlþ®ÙuvØdYuvwMqruve%9÷øù,-¥¡¢ úI¡¢%ûÄ¡¢RhuvF fê }~[XMqruvOÅ Ò¢ f ëñ?Á n B>}~% yèúï{îïNûyÕÕ{ uv¥? Oyüz{ H)Òãw«Z)Òãw:¡¢k ¡¢Ú üýåþ Ù9 æM3uv4%`³ yèúï{îïNûyÕÕ{ uv¥?G ¤ {îïÕyüy uv% ÚÛF {îïÕyüy uvBç :7¡¢"x«DF f B>ëñ?Á n B>?@8uvØ M {îïyÕÕ{z uv Qµ¶®Ùx«%Vã¡¢]^Úh+!% öHßà-6ZS uv% Oyüz{ x«?Óĸdege P Oyüz{ x?·´«%F )5F f B>ëñ?Á n B>?@ÓMqruv]^ ):7¡¢k¡¢% ":" D9E oLoLg 7ý¡¢< f ç F÷øB>IÙñ& e < f ÚÛFh?&âã e o g p o K pÅ f ào g pQ9 Oyüz{ ã7¡¢¥ Õzüzèüïüy{ü $9ÄÊ%© ^Vã e o K po g pÅ f ào g pOQ9¡¢O¥ Õzüzèüïü $9ÄÊ% ezüzèüïüy{ü ÄÊàuv?@OÕzüzèüïü ÄÊàB>?@5 °± I% f B>ëñ8uvØð5F f B>IÙñ¥ e «wMÏá BÄCÕ&,õÝVW ègú B>?@8%½¾³¥ f <BVWB>?@Ü&ç<B? f ëñ[IÙñåI9uvØð[ «&BÞ% oLoLk Ïá Ïá F {îïyÕÕ{z <{îïNûyÕÕ{z <{îïÕyüyuv®ÙF«&BÞde «ÄÊBe y|z ·¨<Ïá y·¨<«xx®DF¸uv¥« D8w,Ïá 5F yèúïüîïÕyüy uv[ yèúï{îïyÕÕ{z uvEXYWX9÷ d{ýgeBOD8M«F üîïÕyüy uvãwBÞÄÊB÷F«&BÞ ÄÊB8 I% oLoLo Ïáy·¨Ïá< Ïá Ïá y·¨Ïá ®ÙÏá ¦XY I?·¨ÑÒ