2013-10-26 26 views
4

设计要求在特定情况下在时钟的上升沿激活信号,并在时钟下降沿的另一种情况下禁用该信号。这是我的想法:时钟两边的触发信号

[email protected](posedge CLK) begin 
    signal1 <= 1'b0; // reset flag 
    if(circumstance1) signal1 <=1'b1; // raise flag if circumstance occurs 
end 

[email protected](negedge CLK) begin 
    signal2 <= 1'b1; // reset flag (actually set alternate to signal1) 
    if(circumstance2) signal2 <=1'b0; // raise flag if circumstance occurs 
end 

[email protected](posedge signal1 or negedge signal2) begin 
    if(signal1) outsignal <= 1'b0; // activate outsignal 
    else outsignal <= 1'n1; // deactivate outsignal 
end 

这会工作吗?是否有更好的选择(倍增时钟和捕捉单边在这里不是一种选择)。

编辑罗素的回复后。罗素,我认为你提出以下建议:

wire nCLK = ~CLK; 

[email protected](posedge CLK or posedge nCLK or negedge nRESET) begin 
    if(!nRESET) outsignal <= 1'b0; 
    else if(nCLK) outsignal <= 1'b1; 
     else outsignal <= 1'b0; 
end 

我理解你了吗?

+0

您正在使用哪种设备系列? –

回答

2

这是片外信号吗?如果是这样,赛灵思和其他芯片供应商提供可以帮助您的原始设备。如果你连接ODDR2原语,你可能会有更好的运气。反转时钟。将正常时钟驱动到C0,并将时钟反转为C1。然后用你的逻辑设置D0和D1输入。

你上面写的方式不是一个非常强大的解决方案。

尝试使用结构原语来完成此任务。

+0

是的,它是外部信号。不,不是DDR。我需要通过几个输出信号来达到特定的时序,这些输出信号是(时序)绑定到两个边沿的。 – Anonymous

+2

您所描述的是*双数据速率或DDR信号 - 即使它不用于与DDR内存通信。 – duskwuff

+0

你在使用什么供应商和零件?你需要明确定义一个DDR原语。 – Russell