2015-10-06 35 views
-2

我需要構建一個計算器,該計算器根據opCode(4位輸入)採用2個有符號16位數(in1,in2)和預形函數。輸出應該是一個名爲'結果'的有符號16位數字和一位'溢出'具有16位有符號輸入的Verilog計算器

我確實需要幫助修復我的代碼。它不工作,我不知道我做錯了什麼。

操作碼

  1. 0000 .....添加IN1和IN2
  2. 0001 .....減去IN1-IN2
  3. 0010 .....鴻溝IN1十有剩餘1或零(使用模運算符)
  4. 0011 .....位與IN1 IN2
  5. 0100 .....按位XOR IN1 |平方英寸
  6. 0101 .....補IN1
  7. 0110 .....位或IN1 IN2
  8. 0111 .....補IN1
  9. 1000 .....增量IN1通過1個
  10. 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 
    
+0

「這不行」:你需要提供更多的細節。 – toolic

+0

嘗試'always @ *'而不是'always @(opcode)'。瞭解'$ display'和'$ monitor'之間的區別。您的代碼可能會受益於case語句。 – Greg

+1

剛纔注意到,也有一些明顯的編譯錯誤。檢查你的日誌文件。 – Greg

回答

1

我強調幾個問題:

module calculator(
    input [15:0] in1, //<-- title says inputs are signed 
    input [15:0] in2, 
    input [3:0] opCode, 
    output [15:0] //<-- undeclared name 
); 
reg [3:0] opCode; 
reg [15:0] in1; //<-- inputs can not be reg 
reg [15:0] in2; 
reg [15:0] result; 
reg overflow; 

也許應該是:

module calculator(
    input  signed [15:0] in1, 
    input  signed [15:0] in2, 
    input    [3:0] opCode, 
    output reg signed [15:0] result 
); 
reg overflow; 
相關問題