谁给我解释一段Verilog程序?

来源:百度知道 编辑:UC知道 时间:2024/06/08 11:04:56
reg iclk_delay1;
reg iclk_delay2;

always @(posedge rst or posedge lclk)
begin
if(rst)
begin
iclk_delay1 <= 1'b0;
iclk_delay2 <= 1'b0;
end
else
begin
iclk_delay2 <= iclk_delay1;
iclk_delay1 <= iclk;
end
end

wire clk_posedge = (iclk_delay1) & (~iclk_delay2);
wire clk_negedge = (~iclk_delay1) & (iclk_delay2);
//detect first negedge after gate active
reg first_negedge_det;

always @(posedge rst or posedge lclk)
begin
if(rst)
first_negedge_det <= 1'b0;
else if(!igate)
first_negedge_det <= 1'b0;
else if(clk_negedge)
first_negedge_det <= 1'b1;
end

为什么这样就能检测出clk下降沿呢?
一楼的回答。。。。我是2系的,没想到3系也用Verilog啊。。。你的解释是在程序里考虑了系统延迟的影响么?不然“iclk_delay2 <= iclk_delay1;
iclk_delay1 <= iclk; ”这两句应该是同时执行的吧?iclk_delay2应该和iclk_delay1信号相同啊。。。

经仿真无法检测下降沿。
不知道LZ用意何在?不直接用CLK下降沿而采用posedge 检测?

clk_negedge 不是一直会为低电平吗?有为高电平‘1’的情况?楼主对这段代码做过仿真没?

不好意思,前面错将iclk看成lclk了。
若iclk的下降沿到达则iclk_delay1 前一次采集到1,后一次采集到0(即随iclk变化同样有个下降沿的过程),又由于iclk_delay2 较 iclk_delay1 延迟了一个时钟周期(lclk),这样势必会造成一个时钟周期内iclk_delay1 变为0,而iclk_delay2仍然为1,此时clk_negedge恰好为1,而且仅在iclk的下降沿时才会出现这种情况,故由clk_negedge为1可断定iclk的下降沿到达。

clk_negedge只有在iclk到下降沿时(这时iclk_delay1=0,iclk_delay2=1)等于1,这时first_negedge_det=1
如果是测iclk的下降沿,那么只要找到first_negedge_det=1就行了。
本人是菜鸟,如果有错请指正

真巧,刚才发现你也是北航的
我三系的,你几系?

正因为它俩同时执行它们才不同!如果先执行iclk_delay1 <= iclk;后执行iclk_delay2 <= iclk_delay1;,这样它们俩才能相同
我现在在北邮读研,不在三系了