xytlucil

标旗信号的跨时钟域处理

0
阅读(1543)

昨天在做FIR滤波器时,输入信号的时钟是512k,而系统时钟是100m,需要给IP核一个使能信号,表示输入信号的有效。这个信号需要的频率是512k,但是宽度是10ns(对应系统时钟100m)。而且需要避免这个信号和100m时钟信号同时变化,这样是一个亚稳态。所以在100m下降沿使这个信号由0变到1。这样在100m的上升沿信号是稳定的。这是一个快采慢的问题。

1)快采慢一般采用边沿触发

针对这个问题

wire s_axi_data_valid;

reg s_axi_data_valid_r0;

reg s_axi_data_valid_r1;

always@(negedge clk100m)

begin

s_axi_data_valid_r0    <=clk512k;

s_axi_data_valid_r1   <=s_axi_data_valid_r0;

end

assign s_axi_data_valid=(!s_axi_data_valid_r1)&s_axi_data_valid_r0;

这样这段程序就实现了在512k上升沿,产生了一个10ns的信号。


2)对于慢采快

假设一个这样的场景,输入信号为100m,产生了10ns的一个使能信号(m_axi_data_valid),当你用10m的信号去采样时,有可能会采不到。需要人为的把他延长,直到10m的信号可以采到

reg m_axi_data_valid_r0;

reg [2:0] counter;

always@(posedge 100m)

if(m_axi_data_valid==1)

    begin

        if(counter==4)

            begin

            m_axi_data_valid_r0<=0;

            counter<=0;

            end

        else

            begin

            m_axi_data_valid_r0<=1;

            counter<=counter+1;

            end

    end

else

m_axi_data_valid_r0<=0;