我试图创建一个d型计数器,当q0 = 0,q1 = 0且q2 = 1时复位。
当计数器达到此值但未重置时,我可以使值ADM触发吗?任何帮助表示感谢!
// DEFINING D TYPE FLIP FLOP
module D_FF(q,qb,d,clk,rst,pst);// pst or preset sets output q to 0(when pst=1)
// rst resets to 1 takes priority
output q,qb;
input d,clk,rst,pst;
reg q;
assign qb = ~q;
always @ (posedge clk or negedge rst or negedge pst)
case ({rst,pst })
2'b00: q <= d;
2'b01: q <= 0;
2'b10: q <= 1;
2'b11: q <= d;
endcase
endmodule
下面的代码包含一个注释掉的重置分配我不明白为什么它不起作用:/。 ////////////////计数器代码///////////////////////////
module BIT_COUNTER(clk,reset,pst,q0,q1,q2,ADM);
wire d1,d2,d3;
input clk,reset,pst;
output q0,q1,q2,ADM;
D_FF dt0(q0,d1,d1,clk,reset,pst);
D_FF dt1(q1,d2,d2,d1,reset,pst);
D_FF dt3(q2,d3,d3,d2,reset,pst);
assign ADM = ( (q0 == 0) & (q1 == 0) & (q2 == 1));
// WHY CANT I RESET HERE USING ASSIGN ?
//assign reset = ( (q0 == 0) & (q1 == 0) & (q2 == 1));
endmodule
我使用测试平台对其进行了模拟,ADM将触发但不会重置
// Test Bench design to test the circuit under simulation..
module test;
reg clk,reset,pst;
BIT_COUNTER counter(clk,reset,pst,q0,q1,q2,ADM);
initial
begin
clk = 0;
pst = 1;
reset = 0;
#10 pst = 0;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
#10 clk = ~clk;
end // end of test block.
endmodule // end of test module.
enter code here
答案 0 :(得分:1)
StackExchange's Electrical Engineering网站上有一个非常相似的问题,因此我会重复使用answer {。}}。
两大问题:
不要让翻牌自己异步重置。这包括间接通过组合逻辑。它可能在模拟中起作用 (在你的情况下似乎没有),但在FGPA / ASIC脉冲有 太短暂的良好变化,可能是亚稳态。添加 创造更清洁脉搏的延迟是一种创可贴;它可以工作 您尝试的条件然后意外失败与不同的路由, 寄生或其他偏差。保持一切也很重要 异步设置/复位信号无故障,否则冒险 意外的设定/重置或亚稳态。
- 醇>
不建议将菊花链计数器(其中一个触发器的q用作另一个触发器的时钟)用于实际设计。 他们可能会有糟糕的时机和错误的输出。真正的失败者 时钟到q的延迟,你可以模拟Verilog中的延迟 非阻塞延迟(例如
q <= #1 ~q;
)。串起一堆这个 在一起,你会发现价值需要更长的时间来解决。 菊花链计数器适合学习,但如果所有的翻转都是最好的 由完全相同的时钟驱动。与第1点不同,很小 菊花链计数器不太可能引起重大问题,但是最好 不要参与使用它们的做法。保持设计在一个时钟域内同步。
在这个特定的情况下,我不知道你是否想要一个计数器从0-> 1-> 2-> 3-> 0或0-> 1-> 2-> 3- 3-将4-大于0。如果你只想要它去三,那么你只需要两个触发器就可以将一个触发器添加到一个2位宽的三个溢出中并变为零。如果你想要最多四个,那么你想要一个同步重置。
正如sharvil指出的那样,reset
是bit_counter
的输入,因此bit_counter
及其子模块不允许驱动它。您可以添加其他信号。
最后一点是你的D_FF
看起来很奇怪,我不确定你的合成器会如何对待它。普通的D-FF使用if语句优先级,特别是异步复位/预置。
always @ (posedge clk or negedge rst or negedge pst) begin
if (!rst) begin
q <= 1'b0;
end
else if (!pst) begin
q <= 1'b1;
end
else begin
q <= d;
end
end
答案 1 :(得分:0)
我同意格雷格所说的一切。但是,对于您来说,在Verilog中编写3位计数器是多么容易,它可能(或可能不)具有指导意义。你真的应该瞄准这种风格,而不是你采用的风格。这种风格更具可扩展性,强大,高效,可重复使用......
module BIT_COUNTER(clk,reset,pst,q0,q1,q2,ADM);
input clk,reset,pst;
output q0,q1,q2,ADM;
reg [2:0] q;
always @(posedge clk or posedge reset)
if (reset == 1'b1)
q <= 3'b0;
else
if (pst == 1'b1)
q <= 3'b111;
else
if (q == 3'b100)
q <= 3'b0;
else
q <= q + 1'b1;
assign {q2, q1, q0} = q;
assign ADM = ((q0 == 1'b0) & (q1 == 1'b0) & (q2 == 1'b1));
endmodule
http://www.edaplayground.com/x/F2T
警告1:我不确切地知道你的目标是什么,所以这可能不是你想做的。
警告2:我不喜欢异步重置和预设。我认为你需要一个复位信号(同步或异步),它将设计置于已知状态。 (不要太担心这是否意味着将触发器初始化为0或1 - 只需调用它&#34;重置&#34;)。在上面的示例中,重置是异步的。如果您还需要预设信号(作为设计正常操作的一部分),那么这应该是同步的。因此我就这样编码了。