0

出力が次の入力の1つである計算を行っています。ただし、マルチプレクサの出力が 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
4

1 に答える 1

2

出力が 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

リセットまたは初期条件を指定していないためy1、 、e1u1およびwk時間ゼロでは になることに注意してください。xクロックの両方のエッジでフリップフロップをトリガーする理由はわかりませんが、negedge でアクティブ LOW リセットがトリガーされるのは一般的です。

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 の出力が表示されなくなります。

EDAプレイグラウンドで

于 2015-03-12T08:21:47.470 に答える