2015-10-06 5 views
-2

Мне нужно построить калькулятор, который принимает 2 подписанных 16-разрядных номера (in1, in2) и функции преформ на них в зависимости от opCode (4-битный вход). Выходы должны быть подписанным 16-битным номером с именем «результат» и один бит «переполнение»Verilog Calculator с 16-разрядными входами с подписями

Мне действительно нужна помощь в исправлении кода. Это не работает, и я не уверен, что я делаю неправильно.

OpCode

  1. 0000 ..... Добавить IN1 и IN2
  2. 0001 ..... вычитать in1-in2
  3. 0010 ..... разделить in1 на десять с остатком 1 или ноль (использование оператора модуль)
  4. 0011 ..... побитовое и IN1 IN2
  5. 0100 ..... побитового XOR IN1 | дюйм2
  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;