2017-02-10 10 views
-1

Я работаю над программой Verilog, которая должна добавить подписанный 8-битный вход на 16-разрядный вывод при каждом такте и сбросить при получении сигнала сброса. Часть добавления работает нормально, и даже добавление отрицательного значения 1 работает, но я получаю странные результаты в моделировании для чисел, меньших этого. Прошло около года с тех пор, как я в последний раз использовал Verilog, и, несмотря на все, что я могу придумать, я не знаю, в чем проблема. Вот что у меня есть, насколько код:Verilog Signed Addition Ошибка вычитания

module varcount (clk, reset, in, out); 
input clk, reset; 
input [7:0] in; 
output reg [15:0] out; 
reg [15:0] temp; 
reg [15:0]count; 
parameter X=1000000; 
always @ (posedge clk) 
    begin 
    if (in[7] == 1) 
    begin 
    temp = 16'b00000000000000001 + !in; 
    count = count - temp; 
    if (reset) 
    begin 
     count = 0; 
     out = 0; 
    end 
    out = count; 
end 
    else 
    begin 
     count = count + in; 
     if (reset) 
     begin 
      count = 0; 
      out = 0; 
     end 
     out = count; 
    end 
end 
endmodule 

Вот мой вход моделирования:

enter image description here

И вот вывод, который я получаю.

enter image description here

Похоже Прямодушная ошибки в моей программе, но я не могу идентифицировать.

+2

Добро пожаловать в StackOverflow. Трудно прочитать ваш код, потому что вы не отделили его должным образом. Вы также не показываете, что вы ожидаете быть правильным результатом по сравнению с фактическим результатом. –

ответ

0

Проблема в том, что вы делаете логическое отрицание in против поразрядного отрицания.

Ваш код может быть значительно упрощен

  • переместив reset условный переход на верхний уровень
  • используя signed типы данных
  • с использованием Verilog-2001 декларации стиля порта

Для пример:

module varcount (input clk, reset, 
      wire signed [7:0] in, 
    output reg signed [15:0] out); 
always @ (posedge clk) 
      if (reset) 
       out = 0; 
      else 
       out = out + in; 
endmodule 
+0

Есть ли способ получить из беззнакового массива в подписанный массив и наоборот? – StandardIssue

+0

Вы должны задать это как новый вопрос, с новым примером. –

0

Я вижу это в вашем коде:

temp = 16'b00000000000000001 + !in; 
count = count - temp; 

температура выглядит как вы пытаетесь вычислить двойки комплемента. ! - это логическое НЕ. вам понадобится ~ для немного мудрой инверсии.

так что вы могли бы:

sum <= a + (~b +1'b1); 

Или

sum <= a - b; 

т.е. -b == (~b +1'b1)