Synchronization Verilog下降沿检测

Synchronization Verilog下降沿检测,synchronization,verilog,clock,hdl,Synchronization,Verilog,Clock,Hdl,我正在为要在FPGA上实现的UART编写Verilog代码,在同步到第一个字节后的起始字节时遇到了一些问题 我的经理建议同步我接收到的信号,并使用某种中断作为向我的FSM传达已识别启动的手段 我读过关于上升沿检测技术的书,我觉得我可以这样做: module StartDetectionUnit ( input clk, state, signal_in, output trigger ); reg signal_d; always @(posed

我正在为要在FPGA上实现的UART编写Verilog代码,在同步到第一个字节后的起始字节时遇到了一些问题

我的经理建议同步我接收到的信号,并使用某种中断作为向我的FSM传达已识别启动的手段

我读过关于上升沿检测技术的书,我觉得我可以这样做:

module StartDetectionUnit (
    input clk, state, signal_in,
    output trigger
    );   

    reg signal_d;

    always @(posedge clk)
        begin
            signal_d <= signal_in;
        end
    assign trigger = signal_in & (!signal_d);

endmodule    
模块启动检测单元(
输入时钟、状态、信号输入,
输出触发器
);   
reg信号;
始终@(posedge clk)
开始

信号\u d如果您的信号\u in来自您的设计之外,则未正确同步。在您的设计中,您只使用一个d型锁存器,需要两个

reg signal_d;
always @(posedge clk)
    begin
        signal_d <= signal_in;
    end
有关同步的详细信息,请访问一个好网站:

据我所知,您的信号“状态”以3位编码,然后您可以执行以下操作:

assign trigger = (state == 3'b000) ? (signal_sync_old & (!signal_sync)):0;

对于同步设计,可以通过这种方式进行下降沿检测

module StartDetectionUnit (
    input clk, state, signal_in,
    output trigger
    );   

    reg signal_d;

    always @(posedge clk)
        begin
            signal_d <= !signal_in;
        end
    assign trigger = !(signal_in | signal_d);
endmodule    

我也有同样的问题。我认为当主时钟采样率较高时,基本的下降沿检测失败。输入波特率信号从高到低需要时间。一旦检测到高-低转换(在波特率下降信号的中间),您就有可能在它实际达到最低值之前再次尝试检测它。在这种情况下,您将有一个从低到低的检测,因此下降过渡丢失。我要解决这个问题的方法是,一旦检测到下降沿,就立即锁定检测器,这样就必须手动重新启动检测器,以便第二次检测。

澄清:“信号_in”是模拟过程中从USB到UART桥接器或测试台接收的位。模块启动检测单元(输入时钟、状态、信号输入、输出触发器);reg信号;始终@(posedge clk)开始信号\u无法模拟异步外部输入信号。它总是在模拟中工作。即使是通过测试台?对不起,如果我听起来不清楚,但我大部分都是学术经验,我的总经理并没有严格遵循我在这个问题上的工作。
assign trigger = signal_sync_old & (!signal_sync);
assign trigger = (state == 3'b000) ? (signal_sync_old & (!signal_sync)):0;
module StartDetectionUnit (
    input clk, state, signal_in,
    output trigger
    );   

    reg signal_d;

    always @(posedge clk)
        begin
            signal_d <= !signal_in;
        end
    assign trigger = !(signal_in | signal_d);
endmodule    
assign sout = !(sin | (!sin));