[問題] 4x4 乘法器 verilog 一問已刪文
目前是自學,有遇到作業問題想請教各位大大,感謝
(如果排版有誤,請見諒)
題目:
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
08/27 10:29, 2F
→
08/27 10:29,
4年前
, 3F
08/27 10:29, 3F
推
08/27 20:33,
4年前
, 4F
08/27 20:33, 4F
→
08/27 20:33,
4年前
, 5F
08/27 20:33, 5F