输入输出同步问题

2019-07-15 22:22发布

本帖最后由 x282718048 于 2016-10-9 09:21 编辑

请问论坛里的各位大神,用altera三代的 FPGA利用输入脉冲信号的上升沿触发产生一个同步输出脉冲时,输出信号的上升沿相对输入上升沿来说有一个周期的抖动,请问这是怎么产生的,该怎么解决?输出信号频率大概100-200M,万分感激!!!
ns_delay.v 下载积分: 积分 -1 分
2.24 KB, 下载次数: 10, 下载积分: 积分 -1 分 Verilog
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
lfjd05
1楼-- · 2019-07-17 17:25
本帖最后由 lfjd05 于 2016-10-9 14:24 编辑
x282718048 发表于 2016-10-9 09:25
大神,我把代码贴出来了,也麻烦你帮忙看下,谢谢!

跑了一下你的代码,在低速情况下没有你说的问题,接近100MHz的时候RTL仿真出现了,毛刺(位于右下角,最后一条波形) 捕获.JPG
不知道这是不是楼主发现的问题。
怀疑问题出现在这段代码里,
        always @(posedge clk, negedge reset_n)
        begin
                if(!reset_n)
                        begin
                                delay_counter <= 32'b0;
                                width_counter <= 32'b0;
                                trigger_out          <= 1'b0;
                                set_out                  <= 1'b0;
                        end
               
                else
                        begin
                                if(upclk)
                                        begin
                                                if((set_delay_length == 0) || (delay_counter == set_delay_length))
                                                        begin
                                                                set_out = 1'b1;
                                                                delay_counter = 0;
                                                        end
                                                else
                                                        delay_counter <= delay_counter + 1'b1;
                                        end
                                else
                                        begin
                                                if((delay_counter > 0) && (delay_counter < set_delay_length))
                                                                delay_counter <= delay_counter + 1'b1;
                                                else if((set_delay_length != 0) && (delay_counter == set_delay_length))
                                                        begin        
                                                                set_out = 1'b1;
                                                                delay_counter = 0;
                                                        end
                                                else
                                                        trigger_out = 1'b0;        
                                        end
                                       
                                if(set_out)
                                        begin
                                                if(width_counter == set_pulse_width)
                                                                begin
                                                                                width_counter <= 32'b0;
                                                                                delay_counter <= 32'b0;
                                                                                trigger_out          <= 1'b0;
                                                                                set_out                  <= 1'b0;                                                        
                                                                end
                                                else
                                                                begin                                                        
                                                                                width_counter <= width_counter + 1'b1;
                                                                                trigger_out   <= 1'b1;
                                                                end
                                        end
                                else
                                        trigger_out <= 1'b0;
                                
                        end
                end
组合逻辑过多,速度快的时候由于逻辑电平实际有先后顺序,不是同时到达的,所以波形出现了短暂的跳变。
修改的话,找到组合逻辑比较复杂的地方,加入上升沿判断,只有逻辑满足要求且收到一个clk上升沿时才给输出赋值
x282718048
2楼-- · 2019-07-17 20:44
lfjd05 发表于 2016-10-9 14:22
跑了一下你的代码,在低速情况下没有你说的问题,接近100MHz的时候RTL仿真出现了,毛刺(位于右下角,最后一条波形)
不知道这是不是楼主发现的问题。
怀疑问题出现在这段代码里,

你好,首先非常谢谢你的建议;我板子的时钟频率是200M的,频率比较高,你仿真出现的毛刺在我实际板子上没有出现,现在出现的问题是:从示波器(4G带宽)上看输出周期信号的前沿相对输入周期信号的前沿有一个周期的抖动,比如说这个周期输入输出上升沿相隔10ns,下一个周期可能是10-15个ns,从示波器上看输入输出前沿相对抖动,也就是有10个ns的固定延时(这是信号延时和寄存器存储引起的),另加5个ns的不固定延时(我所说的一个周期抖动)。麻烦帮忙想下这是怎么产生的?该怎么解决。谢谢你!
lfjd05
3楼-- · 2019-07-17 23:44
x282718048 发表于 2016-10-9 15:13
你好,首先非常谢谢你的建议;我板子的时钟频率是200M的,频率比较高,你仿真出现的毛刺在我实际板子上没有出现,现在出现的问题是:从示波器(4G带宽)上看输出周期信号的前沿相对输入周期信号的前沿有一个周期的抖动,比如说这个周期输入输出上升沿相隔10ns,下一个周期可能是10-15个ns,从示波器上看输入输出前沿相对 ...

哦,我实验室没有示波器能采那么快速度的波形没法给你实测。建议你现在Gate-level仿真里看看有没有这个问题。如果没有说明是硬件电路问题。毕竟就5ns,哪个环节瑕疵都有可能啊
李春明
4楼-- · 2019-07-18 04:57
x282718048 发表于 2016-10-9 09:25
大神,我把代码贴出来了,也麻烦你帮忙看下,谢谢!

这个我也不太懂  这个你还是参考14楼坛友的意见吧
x282718048
5楼-- · 2019-07-18 05:36
 精彩回答 2  元偷偷看……
x282718048
6楼-- · 2019-07-18 05:37
王栋春 发表于 2016-10-9 20:15
这个我也不太懂  这个你还是参考14楼坛友的意见吧

嗯,还是非常感谢你的!

一周热门 更多>