关于Mux无法在Verilog中运行的反馈

关于Mux无法在Verilog中运行的反馈,verilog,feedback,mux,Verilog,Feedback,Mux,我正在进行计算,其中输出是下一个输入之一。但是,mux输出仅提供X,并导致所有其余计算出错。如何克服这个问题?是因为闹钟吗 这是我的密码: module all2(input sel,clk, input signed [15:0]x,d, output signed [15:0]w,e,y); localparam u = 16'd2; wire [15:0]w1; reg [15:0]y1,e1,u1,wk; assign w = wk; assi

我正在进行计算,其中输出是下一个输入之一。但是,mux输出仅提供X,并导致所有其余计算出错。如何克服这个问题?是因为闹钟吗

这是我的密码:

module all2(input sel,clk,
           input signed [15:0]x,d,
           output signed [15:0]w,e,y);
localparam u = 16'd2;
wire [15:0]w1;
reg [15:0]y1,e1,u1,wk;
assign w = wk;
assign e = e1;
assign y = y1;
assign w1 = (sel)?wk:16'd0;
    always @(posedge clk or negedge clk)
    y1 <= x * w1;
    always @(posedge clk or negedge clk)
    e1 <= d - y1;
    always @(posedge clk or negedge clk)
    u1 <= e1 * x * u;
    always @(posedge clk or negedge clk)
    wk <= u1 + w1;    
endmodule
模块all2(输入sel、clk、,
输入符号[15:0]x,d,
输出符号[15:0]w,e,y);
localparam u=16'd2;
导线[15:0]w1;
reg[15:0]y1、e1、u1、wk;
分配w=wk;
分配e=e1;
分配y=y1;
分配w1=(选择)?工作时间:16'd0;
始终@(posedge clk或negedge clk)

y1输出X不应该导致其余的计算出错,我认为这是另一种情况。模块内有一个X使输出变成X

看看你的方程式,你有:

w = wk;
e = e1;
y = y1;
w1 = (sel)?wk:16'd0;

always @(posedge clk or negedge clk) begin
  y1 <= x * w1;
  e1 <= d - y1;
  u1 <= e1 * x * u;
  wk <= u1 + w1;  
end
一旦这是照顾我不再看到x的输出从您的模块


您的解决方案解决了输入X条件的问题,但mux(W)的输出无法运行。有没有办法解决这个问题?在每个时钟上升沿上执行4个操作。但是当
rst\u n
较高时,由于参数(
y1
e1
u1
wk
)连续更新,因此需要4个周期才能
w
准备就绪。因此,在更改输入后,等待4个周期以查看最终结果(
w
)。我确认这个答案(@Morgan)。@Amir,那么我的意思是我不能在一个周期内获得4(y1,e1,u1,wk),对吗?我需要等待4个周期以获得正确的wk,然后可以在第5个周期的下一个y1上实施。1个周期后的
y1
、2个周期后的
e1
、3个周期后的
u1
和4个周期后的
wk
具有预期值。为了更好地理解,你可以画出你的设计原理图。@Jack93我同意阿米尔的观点,因为(y1,e1,u1,wk)是形成一个链的触发器。输入到输出需要4个时钟周期。您可能想开始一个关于您尝试执行的等式的新问题,说明您尝试了什么以及为什么它是错误的(4个周期延迟)。如果您详细解释算法以及您希望从输出中得到什么,答案会更容易。@Amir,首先,w1为0,然后按照上面所示的公式计算,然后得到新的w1。新的w1将在下一次计算中使用。
w = wk;
e = e1;
y = y1;
w1 = (sel)?wk:16'd0;

always @(posedge clk or negedge clk) begin
  y1 <= x * w1;
  e1 <= d - y1;
  u1 <= e1 * x * u;
  wk <= u1 + w1;  
end
always @(posedge clk or negedge rst_n) begin //<- negedge rst_n
  if (~rst_n) begin
    y1 <= 'd0;
    e1 <= 'd0;
    u1 <= 'd0;
    wk <= 'd0;
  end
  else begin
    y1 <= x * w1;
    e1 <= d - y1;
    u1 <= e1 * x * u;
    wk <= u1 + w1;  
  end 
end