как инициализировать вывод на Verilog (последовательная схема) - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в кодировании Verilog, и у меня есть проект колледжа по разработке простой системы лифтов.Код прекрасно работал на FPGA, но я не могу заставить симуляцию работать.Это мой код:

module move(
    output reg [1:0] current,
    input [1:0] target,
    input clk,
    input overloadin,
    output reg up,
    output reg down
    );

always@(posedge clk)
if (overloadin==1'b0)
begin
if (target[1:0]>current[1:0])
begin
current[1:0] <= current[1:0] + 1;
up = 1'b1;
down = 1'b0;

end
else if (target[1:0]<current[1:0])
begin
current[1:0] <= current[1:0] - 1;
down = 1'b1;
up = 1'b0;

end
else
begin
up = 1'b0;
down = 1'b0;

end
end
endmodule 

'current' объявлен как провод в верхнем модуле.Я предполагаю, что не могу смоделировать это, потому что значение 'current' не было инициализировано.Как я могу инициализировать его значение, не влияя на функциональность блока Always?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы смешиваете блокирующие и неблокирующие операторы, что приводит к состоянию гонки во время симуляции.Я изменил ваш код.

module move(
 output reg [1:0] current,
 input [1:0] target,
 input clk,
 input reset_n,             //Added an additional input
 input overloadin,
 output reg up,
 output reg down
);

always@(posedge clk or negedge reset_n)
begin
 if(!reset_n)               //Active low reset
 begin
   up      <= 1'd0;
   down    <= 1'd0;
   current <= 2'd0;
 end
else if(!overloadin)
begin
 if(target > current)
 begin
  up      <= 1'd1;
  down    <= 1'd0;
  current <= current + 2'd1;
 end
 else if(target < current)
 begin
  up      <= 1'd0;
  down    <= 1'd1;
  current <= current - 2'd1;
 end
else
 begin
  up      <= 1'd0;
  down    <= 1'd0;
 end
  end  end  endmodule
0 голосов
/ 07 декабря 2018

Вы можете использовать «начальный» оператор или добавить сигнал сброса.

initial
   current = 2'b00;

или

  input reset_n,
  ...
   always @(posedge clk or negedge reset_n)
   begin
      if (!reset_n)
         current <= 2'b00;
      else
      ...
   end

Я лично предпочитаю последнее, но вы можете найти несколько обсуждений по использованиюначального и повторного сброса в этом и ее форуме.

Я не проверял остальную часть вашего кода, потому что он не читается из-за отсутствия отступов.

...