【问题标题】:Feedback on Mux fail to run in Verilog关于 Mux 无法在 Verilog 中运行的反馈
【发布时间】:2015-03-12 06:25:44
【问题描述】:

我正在计算输出是下一个输入之一。然而,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

这里是测试台:

module all2_tb();
reg sel, clk;
reg signed [15:0] x, d;
wire signed [15:0] w, e, y;

all2 U1(.sel(sel),.clk(clk),.x(x),.d(d),.w(w),.e(e),.y(y));

initial begin
    clk = 1'b0;
    forever
    #1 clk = ~clk;
end

initial begin
sel <= 1'b0;
x <= 16'd0;
d <= 16'd0;
#2;
sel <= 1'b1;
x <= 16'd1;
d <= 16'd2;
#1;
x <= 16'd3;
d <= 16'd4;
#1;
x <= 16'd5;
d <= 16'd6;
#1;
$stop;
end
endmodule

【问题讨论】:

  • 如果你解释更多关于算法以及你想要从输出中得到什么,会更容易回答。
  • @Amir,起初 w1 为 0,然后按照上面所示的公式,然后得到新的 w1。新的 w1 用于下一次计算。

标签: verilog feedback mux


【解决方案1】:

输出 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

请注意,y1e1u1wk 在时间为零时将是 x,因为您没有指定重置或初始条件。我不确定您为什么要在时钟的两个边沿触发触发器,但通常会在 negedge 触发低电平有效复位。

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

一旦解决了这个问题,我就再也看不到 x 模块的输出了。

On EDA Playground

【讨论】:

  • 您的解决方案已经解决了输入 X 条件的问题,但是 mux (W) 的输出无法运行。有什么办法解决这个问题吗?
  • 在每个时钟上升沿执行 4 次操作。但是当rst_n为高电平时,由于参数(y1e1u1wk)是连续更新的,需要4个周期才能使w准备好。因此,在更改输入后等待 4 个周期以查看最终结果 (w)。我确认这个答案 (@Morgan)。
  • @Amir,这意味着我无法在 1 个周期内获得 4 (y1, e1 , u1, wk) 对吗?我需要等待 4 个周期才能获得正确的 wk,然后可以在第 5 个周期的下一个 y1 上实现它。
  • y1 在 1 个周期后,e1 在 2 个周期后,u1 在 3 个周期后和 wk 在 4 个周期后具有预期值。您可以画出您的设计示意图以便更好地理解。
  • @Jack93 我同意 Amir 的观点,因为 (y1, e1, u1, wk) 是触发器,形成一个链,输入需要 4 个时钟周期才能到达输出。您可能想就您尝试执行的方程式提出一个新问题,显示您尝试过的内容以及错误的原因(4 个周期延迟)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2010-09-11
  • 2012-08-27
相关资源
最近更新 更多