1

我想产生一个reset持续很短时间的信号(高电平有效)。我通过以下代码实现了它:

always @(posedge clk or negedge rst_n or posedge data) begin
  if(~rst_n | data)
    data <= 1'b0;
  else if(ena)
    data <= 1'b1;
  else
    data <= data;
end 

合成为D flip-flop

http://i.stack.imgur.com/ojqLy.png

我生成的信号将1仅用于等于通过OR门的传播时间的时间。现在我想删除rst_n信号。但如果我这样做,我会收到以下信息D flip-flop

http://i.stack.imgur.com/PpcJH.png

在那种情况下,我的信号永远不会很高。我想出的最简单的解决方法是在和NOT之间添加 2 个门。不幸的是,我的软件 ( ) 会综合这两个门。QCLRQuartus II

rst_ntl ; dr - 如何删除reset正确生成的信号?

4

2 回答 2

2

您是否尝试过使用 Quartus 的“综合保持”标签来插入缓冲区?

http://quartushelp.altera.com/13.1/mergedProjects/hdl/vlog/vlog_file_dir_keep.htm

尝试这个:

module test(clk,ena,data);
input clk, ena;
wire data_n /*synthesis keep*/;
wire data_nn /*synthesis keep*/;
output reg data;

assign data_n = ~data; 
assign data_nn = ~data_n; 

always @(posedge clk or posedge data_nn) begin
  if(data_nn)
    data <= 1'b0;
  else if(ena)
    data <= 1'b1;
  else
    data <= data;
end

endmodule
于 2014-07-14T04:56:21.090 回答
2

你能让 D-flop 同步复位,而不是异步复位吗?

如果您将输出反馈到异步复位中,您将获得一个非常不稳定的欠幅脉冲,它可能甚至可能无法完全传播到设计中。在这种情况下,您实际上可能只重置了设计中的一半触发器,并且每次打开设备电源时您可能会得到不同的行为。

如果你想驱动复位直到第一个姿势,那么只需将触发器初始化为 1,并将 0 放在 D 引脚上。然后你的触发器将驱动 1 直到第一个时钟周期。这可能会不稳定,具体取决于时钟开始运行的时间与设备完全供电的时间。

理想情况下,您需要更长的复位脉冲,以使设备有更多时间上电并通过设计稳定地传播复位,并确保在释放复位之前初始化任何其他同步复位触发器。在这种情况下,您可以将一个几位的计数器初始化为某个值,并让它在上电时开始倒计时,然后在计数器达到 0 时取消复位。

此外,这仅适用于您可以为触发器设置初始值的 FPGA 设计。如果您正在讨论硅设计,那么肯定需要外部复位信号。

于 2014-07-12T19:53:18.100 回答