Verilog 时钟两侧的触发信号

Verilog 时钟两侧的触发信号,verilog,clock,fpga,Verilog,Clock,Fpga,该设计要求在时钟上升沿的特定情况下激活信号,在时钟下降沿的另一种情况下禁用信号。以下是我的想法: 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

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

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
始终@(posedge CLK)开始

信号1这是片外信号吗?如果是这样,Xilinx和其他芯片供应商提供的原语可以帮助您实现这一点。如果你把一个奇怪的R2原语连接起来,你可能会有更好的运气。把钟倒过来。将正常时钟拨入C0,然后将时钟反向拨入C1。然后使用您的逻辑设置D0和D1输入

您上面所写的方法不是一个非常健壮的解决方案

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

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

在我们的项目中验证并使用了实现此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
模块DEFF(
输入时钟,复位,输入,
输出
);
reg trig1,trig2;
分配输出=trig1^trig2;
始终@(posedge时钟,posedge重置)开始

如果(复位)trig1为是,则为外部信号。不,不是DDR。我需要用几个连接到两个边缘的输出信号来实现特定的定时。您所描述的是双倍数据速率,或DDR,信令-即使它不用于与DDR内存通信。您使用的是哪个供应商和部件?您需要明确定义DDR原语。电路在信号转换中不允许有任何中断。我不认为多路DDR电路将是合适的。我正在考虑另一个更高频率的时钟源,以检测单个always块中CLK的posedge和NEGDEDGE(它将解决多个驱动程序的问题)。您使用的是什么设备系列?有人告诉我,在FPGA中,这些块的排列可能不像图中所示的那样整齐。LUT和路由的延迟可能会产生包含小故障的输出信号。
。你认为呢?上面的代码由我测试,并在Altera FPGA的不同项目中使用。存在两种可能的问题:亚稳态问题(当数据输入与时钟信号同时改变时)和时序问题(当路径过长或时钟频率过高时)。但这两个潜在问题并非该模块特有,也可能出现在其他电路中。我没有在Xilinx或其他FPGA中测试这一点,可能是其他编译器在某些情况下会产生混乱。在任何组件中都没有双重转换,因此在足够的速度下不会出现故障。您认为如何?
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