gpt4 book ai didi

verilog - 时钟两侧沿触发信号

转载 作者:行者123 更新时间:2023-12-02 07:23:13 25 4
gpt4 key购买 nike

设计要求信号在时钟上升沿的特定情况下被激活,并在时钟下降沿的另一种情况下被停用。我的想法是这样的:

always@(posedge CLK) begin
signal1 <= 1'b0; // reset flag
if(circumstance1) signal1 <=1'b1; // raise flag if circumstance occurs
end

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

always@(posedge signal1 or negedge signal2) begin
if(signal1) outsignal <= 1'b0; // activate outsignal
else outsignal <= 1'n1; // deactivate outsignal
end

这行得通吗?是否有更好的替代方案(这里不能选择加倍时钟和捕获单边沿)。

在 Russell 回复后

编辑。拉塞尔,我认为你提出以下建议:

wire nCLK = ~CLK;

always@(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

我正确理解了你的意思吗?

最佳答案

您需要所谓的“双边缘触发器”(DEFF)。尽管一些供应商在其 CPLD/FPGA 上提供 DEFF 作为原语,但大多数产品都没有。在这种情况下,您需要自己实现 DEFF。不幸的是,您的文章中的代码always@(thoughtge CLK或posege nCLK或negedge nRESET)将不起作用,因为标准触发器没有超过两个具有单边沿事件的输入。因此,该解决方案必须使用带有附加组合电路的标准触发器。图中的电路解决了这个问题。它保证了无故障操作,因为输出 XOR 元素在每次状态更改时只有单个输入转换。

DEFF schematics

这里是在我们的项目中验证并使用的实现此 DEFF 的 Verilog 代码:

module DEFF (
input clock, reset, in,
output out
);

reg trig1, trig2;

assign out = trig1^trig2;

always @(posedge clock, posedge reset) begin
if (reset) trig1 <= 0;
else trig1 <= in^trig2;
end

always @(negedge clock, posedge reset) begin
if (reset) trig2 <= 0;
else trig2 <= in^trig1;
end
endmodule

关于verilog - 时钟两侧沿触发信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com