-1

关于FPGA进行外部边沿检测,检测不准确问题?

求助各位大佬!
目的是观测到外部出现两个下降沿信号后FPGA做下一步动作(例如LED状态翻转闪烁);

外部设备定时发出两个下降沿信号,信号周期及间隔如下图。
信号通过FPGA管脚接入,FPGA内部通过程序边沿检测下降沿并统计数量(数量到达2后重新计数,并发送动作信号),但是最终发现检测结果不准确,有时候能检测到,有时候检测不到。万分感谢您的解答和建议!
下面是veriloG代码
输入下降沿信号
`//边沿检测
initial num<=1’b0; //下降沿数量
reg [2:0]num;
always @(negedge signal) //输入信号
begin
if(num==3’d2)
num<=1’b1;
else
num<=num+1’b1;
end

//检测下降沿数量为2时led翻转

initial led<=1’b0;
always @(posedge CLK_50M)
begin
if(num==3’d2)
led <= ~led;
else
led <= led;
end`

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
han1003441956 头像
1

你这个还是找本教程看一下,FPGA设计要求尽可能采用同步设计而不是异步设计。你代码中检查输入信号这种处理是完全错误的,FPGA的代码不是像C代码一样,C代码你写的if它就是if,但是FPGA他是工具按你写的代码去推断电路,记住它是推断你的代码表示什么电路,所以你要按它推荐的格式来写,才能保证他推断正确,找本书看一下吧。

编辑 标为违禁 删除 链接 更多选项...
ii1397 头像
0

把signal打两拍,然后去采它的下降沿,而不是直接将signal作为时钟。

编辑 标为违禁 删除 链接 更多选项...
luozz 头像
0

哈哈,一楼二楼说的很对,我直接给你写参考代码吧!reference_code.v

module reference_code (
    input clk;         //系统工作时钟
    input rst;         //系统复位信号,高电平有效
    input signal;      //外部设备输入信号
    output reg led;    //LED灯
);

// signal
reg  [2:0]  signal_reg;     //输入信号缓存
reg  [2:0]  negedge_cnt;    //下降沿计数

// 用FPGA内部时钟同步外部输入信号
always @ (posedge clk)
begin
    if (rst) begin
        signal_reg <= 3'd0;
    end
    else begin
        signal_reg[2:0] <= {signal_reg[1:0],signal};
    end
end

// 下降沿计数
always @ (posedge clk)
begin
    if (rst) begin
        negedge_cnt <= 3'd0;
    end
    else begin
        if (negedge_cnt == 3'd2) begin
            negedge_cnt <= 3'd0;
        end
        else if (signal_reg[2:1]==2'b10) begin
            negedge_cnt <= negedge_cnt + 1'b1;
        end
    end
end

// LED翻转
always @ (posedge clk)
begin
    if (rst) begin
        led <= 1'b0;
    end
    else begin
        if (negedge_cnt == 3'd2) begin
            led <= ~led;
        end
    end
end

endmodule
编辑 标为违禁 删除 链接 更多选项...
幻雪银尘 头像
登录/注册后进行回答