关于FPGA实现下信号边沿检测

本文为自己实现的利用FPGA检测信号下降沿并生成信号的过程:

/*****Author:Chun-juan He
        date:2018.8.13
        function: Edge detection*****/



module detection_edge
    (
        clk,rst_n,out1,out2,out3,triger1,triger2
     );
input clk,rst_n;
output out1,out2,out3,triger1,triger2;

parameter T1S=32'd50_000;
parameter T100MS=26'd500;

//generate the signal out1      
reg [31:0] outreg;
reg signal;
always @(posedge clk or negedge rst_n)
        begin       
                if(!rst_n)
                     begin  
                     outreg<=0;
                     signal<=1;
                     end
                else 

                        if(outreg<=T1S)
                            begin   
                             outreg<=outreg+1'b1;
                             signal<=0;
                             end
                        else if((outreg>T1S)&&(outreg<2*T1S))
                            begin   
                             outreg<=outreg+1'b1;
                             signal<=1;
                             end
                        else
                            begin   
                               outreg<=0;
                             end
        end 

        assign out1=signal;

    //检测下降沿 
 reg TGreg0,TGreg1;
 always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin
            TGreg0<=0;
            TGreg1<=0;
            end
        else 
            begin
            TGreg0<=signal;
            TGreg1<=TGreg0;
            end
    end 
    wire Triger=(~TGreg0&TGreg1)? 1'b0:1'b1;
    assign triger1=Triger;

//检测到下降沿,并产生一个信号
reg TrigerTrue;
reg [31:0] cnt;
always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin 
                cnt<=0;
                TrigerTrue<=0;
            end
        else 
            begin
                if(~TGreg0&TGreg1)
                    begin
                    cnt<=0;
                    TrigerTrue<=1;
                    end
                else
                    begin
                        if(TrigerTrue&&cnt<T100MS)
                            begin
                                cnt<=cnt+1'b1;
                                TrigerTrue<=1;
                            end
                        else
                            begin
                                TrigerTrue<=0;
                            end
                    end
            end
    end

    assign out2=TrigerTrue;

//检测生成信号signal的下降沿
reg signal0,signal1;
always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin
                signal0<=0;
                signal1<=0;
            end 
        else 
            begin
                signal0<=out2;
                signal1<=signal0;
            end

    end

    wire triger2=(~signal0&signal1)? 1'b1:1'b0;


reg signalTrue;
reg [25:0] signaicnt;
always @(posedge clk or negedge rst_n )
begin
    if(!rst_n)
        begin
            signaicnt<=0;
            signalTrue<=0;
        end
    else
        begin
            if(triger2)
                begin
                    signaicnt<=0;
                    signalTrue<=1;
                end
            else 
                begin
                    if(signalTrue&&signaicnt<=T1S)
                        begin
                            signaicnt<=signaicnt+1'b1;
                            signalTrue<=1;
                        end
                    else
                        begin
                            signalTrue<=0;
                        end
                end
        end 
end
assign out3=signalTrue;

endmodule


modelsim仿真结果如下:
这里写图片描述
踩了很多坑 这里发现仿真结果检测到下降沿之后 会有两个clk周期的延时 再生成所需信号 查了很多资料 有人说留有两个机器周期的时间反应 检测到下降沿后 反应一个机器周期 生成信号时再反应一个机器周期 但是由于时间太短 可忽略不计 故为了提高机器周期对设计电路的影响 建议使用高频率的晶振

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA实现脉冲信号边缘检测可以利用 FPGA 内部的计数器和触发器等硬件模块,以及 VHDL 或 Verilog 等硬件描述语言进行设计和实现。 以下是一个简单的 FPGA 脉冲信号边缘检测实现示例,以检测一个外部输入信号的上升沿为例: ```vhdl -- 定义输入、输出端口 entity edge_detection is Port ( clk : in STD_LOGIC; input : in STD_LOGIC; output : out STD_LOGIC); end edge_detection; -- 实现边缘检测 architecture Behavioral of edge_detection is -- 定义计数器和触发器 signal counter : integer range 0 to 9999 := 0; signal trigger : STD_LOGIC := '0'; begin -- 计数器递增 process(clk) begin if rising_edge(clk) then if counter < 9999 then counter <= counter + 1; else counter <= 0; end if; end if; end process; -- 检测上升沿 process(input, counter) begin if input = '1' and counter = 0 then trigger <= '1'; else trigger <= '0'; end if; end process; -- 输出触发信号 process(trigger) begin if trigger = '1' then output <= '1'; else output <= '0'; end if; end process; end Behavioral; ``` 在上面的示例中,我们首先定义了输入端口 clk 和 input,以及输出端口 output。然后在 architecture 中,我们定义了一个计数器 signal counter 和一个触发器 signal trigger,用于实现上升沿的检测。 具体地,我们使用一个 process 对计数器进行递增操作,同时使用另一个 process 对输入信号和计数器进行判断,如果检测到输入信号为高电平且计数器为 0,则表示发生了上升沿,此时触发器的值为 '1';否则触发器的值为 '0'。最后,我们通过一个 process 将触发器的值输出到 output 端口。 这就是一个简单的 FPGA 脉冲信号边缘检测实现示例。在实际应用中,可能需要更复杂的算法和硬件模块来实现不同的边缘检测需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值