上次提出了一个处于异步时钟域的MCU与FPGA直接通信的实现方式,其实在这之前,特权同学想列举一个异步时钟域中出现的很典型的问题。也就是要用一个反例来说明没有足够重视异步通信会给整个设计带来什么样的危害。
要举的这个反例是真真切切的在某个项目上发生过的,很具有代表性。它不仅会涉及使用组合逻辑和时序逻辑在异步通信中的优劣、而且能把亚稳态的危害活生生的展现在你面前。
从这个模块要实现的功能说起吧,如图1所示,实现的功能其实很简单的,就是一个频率计,只不过FPGA除了脉冲采集进行计数外,还要响应CPU的控制。
图1 功能模块
CPU的控制总线是指一个片选信号和一个读选通信号,当二者都有效时,FPGA需要对CPU的地址总线进行译码,然后把采样脉冲值送到CPU的数据总线上。
图2 CPU读时序
对于这样“简单”的功能,不少人可能会给出类似下面的以组合逻辑为主的实现方式:
input clk;
input rst_n;
input pulse;
input cs_n;
input rd_n;
input[3:0] addr_bus;
output reg[15:0] data_bus;
reg[15:0] counter;
always @(posedge pulse or negedge rst_n)
if(!rst_n) counter <= 16‘d0;
else if(pulse) counter <= counter+1’b1;
wire dsp_cs = cs_n & rd_n;
always @(dsp_cs or addr_bus)
if(dsp_cs) data_bus <= 16‘hzzzz;
else begin
case(addr_bus)
4’h0: data_bus <= counter;
4‘h1: ……;
……
default: ;
endcase
end
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』