[問題] 4x4 乘法器 verilog 一問已刪文

看板Electronics作者 (Ian)時間4年前 (2019/08/26 22:15), 編輯推噓1(212)
留言5則, 3人參與, 4年前最新討論串1/1
目前是自學,有遇到作業問題想請教各位大大,感謝 (如果排版有誤,請見諒) 題目: Input: A[3:0], B[3:0], CLK, RESET output:Out[7:0] Behavior: Out=A*B when CLK is at rising edge. When RESET =1, Out[7:0] ="00000000" 主程式: module multiplier(a,b,out,clk,reset); input [3:0] a,b; input clk; input reset; output [7:0] out; wire [3:0] add0, add1, add2, add3; reg [7:0] s_out; assign add0 = (b[0] ==1)? a : 4'h0; assign add1 = (b[1] ==1)? a : 4'h0; assign add2 = (b[2] ==1)? a : 4'h0; assign add3 = (b[3] ==1)? a : 4'h0; assign out= s_out; always@(posedge clk) begin if (reset) s_out <= 0; else s_out <= add0+(add1<<1)+(add2<<2)+(add3<<3); end endmodule Testbench程式: module multiplier_tf(); reg [3:0] a; reg [3:0] b; reg clk; reg reset; wire [7:0] out; multiplier UUT ( .a(a), .b(b), .out(out), .clk(clk), .reset(reset) ); initial begin a = 0; b = 0; clk = 0; reset = 0; end initial clk=1'b1; always #5 clk = ~clk; initial #100 reset=1'b1; initial #5 begin a=1; b=0; end always #5 begin b=b+1; if(b==17) begin a=a+1; b=1; end $monitor("%4dns monitor: a=%d b=%d out=%d", $stime, a, b, out, ); if(a==17) begin $finish; end end 目前是這樣的想法去寫code, 但因為wave form跑出來並不是想要的情況, 想請問主程式跟testbench是哪裡有問題?? 是想要show出 a,b,out,clk,reset這些狀態對應 應該是要clk正緣觸發時,a和b和out要根據clk的觸發而變換值 然後如果有reset觸發,就變成要show 00000000 (但我目前想不到如何一直reset 所以目前只有,在最後面讓reset判斷為1) 想知道是哪裡的觀念錯誤了.. 如果方便私信教學也可以 感謝大大 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.40.224 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1566828937.A.23D.html

08/26 22:31, 4年前 , 1F
頭痛
08/26 22:31, 1F

08/27 10:29, 4年前 , 2F
先不說其他的,你的reset應該要擺在一開始,
08/27 10:29, 2F

08/27 10:29, 4年前 , 3F
DFF才能work
08/27 10:29, 3F

08/27 20:33, 4年前 , 4F
initial clk =0,下一個initial clk=1,到底一開始clk是0
08/27 20:33, 4F

08/27 20:33, 4年前 , 5F
還是1
08/27 20:33, 5F
文章代碼(AID): #1TO-c98z (Electronics)