我想生成一个持续很短时间的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
:
我生成的信号只有1
时间等于通过OR
门的传播时间。现在我要删除rst_n
信号。但如果我这样做,我会收到以下D flip-flop
:
在这种情况下,我的信号永远不会很高。我想出的最简单的解决方法是在NOT
和Q
之间添加2 CLR
个门。不幸的是,我的软件(Quartus II
)将合成这两个门。
tl; dr - 如何移除rst_n
以便正确生成reset
信号?
答案 0 :(得分:2)
你可以让D-flop同步复位,而不是异步复位吗?
如果您将输出反馈到异步复位,您将得到一个非常不稳定的欠幅脉冲,甚至可能无法通过设计完全传播。在这种情况下,您实际上可能只是在设计中重置了一半的触发器,并且每次打开设备电源时都可能会有不同的行为。
如果要驱动复位直到第一个posedge,那么只需将触发器初始化为1,然后将0置于D引脚上。然后你的翻牌将驱动1直到第一个时钟周期。这可能不会很稳定,具体取决于时钟开始运行的时间与设备完全上电的时间。
理想情况下,您需要更长的复位脉冲,以便为器件提供更多的上电时间并通过设计稳定地传播复位,并确保在复位释放之前初始化任何其他同步复位触发器。在这种情况下,您可以将几位的计数器初始化为某个值,并使其在上电时开始倒计时,然后在计数器达到0时置低复位。
此外,这仅适用于您可以为翻牌设置初始值的FPGA设计。如果您正在讨论硅设计,那么肯定需要外部复位信号。
答案 1 :(得分:2)
您是否尝试使用&#34;合成保持&#34; 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