【问题标题】:feedback on mux in verilog关于verilog中mux的反馈
【发布时间】:2015-03-11 08:15:35
【问题描述】:

我正在使用 verilog 执行反馈多路复用器计算。但是,系统不会响应(给 X)输入之一,即 B(由多路复用器控制的输入)。可以帮我指出错误在哪里以及如何解决它。

代码如下:

module test(input sel,input [3:0]a,b,output [3:0]o);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)?w1:in_0;

endmodule

这里是测试平台:

module test_tb();

reg sel;
reg [3:0] a,b;
wire [3:0]o;

test U1(.sel(sel),.a(a),.b(b),.o(o));

initial begin
sel <= 1'b0;
a <= 4'd2;
#2;
sel <= 1'b1;
#2;
a <= 4'd1;
#2;
sel <= 1'b0;
a <= 4'd4;
#2;
end
endmodule

【问题讨论】:

  • w1 只有 1 位宽,应该是 4。
  • @Morgan,很抱歉,但是在 w1 更改为 4 位宽后仍然是相同的结果。
  • b 是一个输入,但您再次尝试编写 (assign b = (sel)?w1:in_0;)
  • @Emman,我希望当 sel 为 0 时 b 等于 0,当 sel 为 1 时 b 是前一个 o 的输出。
  • @Jack93 Emmans 的观点是你不能像那样过度驱动输入。

标签: verilog feedback mux


【解决方案1】:

根据测试台(初始化),b 似乎不是input(它只是多路复用器的输出)

我认为你想实现以下电路:

但为避免创建循环(当 sel=1 时),您应该在设计中添加一个clk 端口以控制操作:

module test(
    input  clk,
    input  sel,
    input  [3:0] a,
    output [3:0] o
);

    wire [3:0] b;
    reg  [3:0] w1;

    assign o = w1;
    assign b = (sel)?w1:4'd0;

    always @(posedge clk)
        w1 <= a + b;

endmodule

【讨论】:

  • 感谢您的帮助。您的方法效果很好,但是我注意到输出有延迟。有什么办法克服吗?
  • 您能详细解释一下延迟吗?输出在每个时钟上升沿更新。必须更改输入并等到时钟上升沿才能看到正确的结果,否则会创建(没有时钟)循环。
  • 我的多路复用器在这种情况下无法运行。这是因为时钟问题吗? stackoverflow.com/questions/29003167/…
【解决方案2】:

看看你的例子:

module test(
  input sel,
  input [3:0] a,
  input [3:0] b,
  output [3:0]o
);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)? w1 : in_0;

注意,sel==1 你有w1 = a+bb =w1,即 w1= a+w1;作为一个组合循环。这行不通。如果内部有一个触发器来打破循环,那么它的行为就像一个累加器。

Emman 的 Aa 指出 b 是一个输入,因此该值不能被覆盖。

此行assign b = (sel)? w1 : in_0; 无效。请注意,它实际上从不使用输入值,因为这在所有情况下都会完全覆盖它。

【讨论】:

  • 当您在测试台上制作 reg [3:0] b 以连接 [3:0] b 时添加到它,您会发现一个无限循环(modelsim 错误为:在时间 2 ns 达到迭代限制.) 参考:edaplayground.com/x/534
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2011-02-20
相关资源
最近更新 更多