-2
我需要構建一個計算器,該計算器根據opCode(4位輸入)採用2個有符號16位數(in1,in2)和預形函數。輸出應該是一個名爲'結果'的有符號16位數字和一位'溢出'具有16位有符號輸入的Verilog計算器
我確實需要幫助修復我的代碼。它不工作,我不知道我做錯了什麼。
操作碼
- 0000 .....添加IN1和IN2
- 0001 .....減去IN1-IN2
- 0010 .....鴻溝IN1十有剩餘1或零(使用模運算符)
- 0011 .....位與IN1 IN2
- 0100 .....按位XOR IN1 |平方英寸
- 0101 .....補IN1
- 0110 .....位或IN1 IN2
- 0111 .....補IN1
- 1000 .....增量IN1通過1個
1001 ....遞減IN1通過1
module calculator( input [15:0] in1, input [15:0] in2, input [3:0] opCode, output [15:0] ); reg [3:0] opCode; reg [15:0] in1; reg [15:0] in2; reg [15:0] result; reg overflow; always @ (opcode) begin if (opCode == 0000) begin // add in1+in2 result=in1+in2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); end if (opCode == 0001) begin //subtract in1-in3 result=in1-in2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); end if (opCode == 0011) begin //divide int1 by 10 w/ remainder as overflow result=in1%10; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 0100) begin //preforms AND operation in1 in2 result=in1&int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0101) begin //preforms XOR operation in1 in2 result=in1^int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0110) begin //preforms OR op on in1 in 2 result=in1|int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0111) begin //complement of in1 result=!in1; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 1001) begin //increase in1 by 1 result=in1+1; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 1000) begin //decrease in2 by 1 result=in2-1; $display("opCode(%b),in2(%d),result(%d),overflow(%b)", opCode, in2, result, overflow); $monitor("opCode(%b),in2(%d),result(%d),overflow(%b)", opCode, in2, result, overflow); end end end endmodule endmodule
「這不行」:你需要提供更多的細節。 – toolic
嘗試'always @ *'而不是'always @(opcode)'。瞭解'$ display'和'$ monitor'之間的區別。您的代碼可能會受益於case語句。 – Greg
剛纔注意到,也有一些明顯的編譯錯誤。檢查你的日誌文件。 – Greg