Как смоделировать задержку в Verilog без #? Это может быть синтезировано - PullRequest
0 голосов
/ 03 октября 2019

Я ищу создание логического элемента И, который получает результат после задержки, скажем, 10 нс, а мои часы - 500 пс. Как я буду откладывать назначение без использования # задержки?

Я попытался создать счетчик, который увеличивается, но как его смоделировать так, чтобы он запускался только при изменении моего ввода. Кроме того, вход не изменится, пока первый выход не будет оценен и назначен. Начальный счетчик равен 0, и допустим, что задержка равна 3'b111, поэтому я хочу, чтобы счетчик перешел с 1 на 3'b111, а затем назначил его для y. Входы a и b к воротам и.

always@(posedge clk)begin
  if (!reset) begin y <=0; counter <=0; end
  else begin
   counter <= counter +1'b1;
   if(counter==delay)begin
     y <= a & b;
     counter <=0;
  end
end

1 Ответ

0 голосов
/ 03 октября 2019

Хорошо, если ваш тактовый цикл составляет 500 пс, то вам нужно будет сосчитать до более высокого значения, чтобы достичь 10 нс. Я переписал ваш код, а также добавил тестовый стенд для вас, чтобы попробовать. Это неаккуратно, я обычно пишу VHDL, а не Verilog. Надеюсь, это поможет.

//Module

module count_and (
    input clk,
    input reset,
    input a,
    input b,
    output reg y,
    output reg [4:0] counter
);

reg ready;

always@(posedge clk)begin
  if (!reset) begin 
    y <=0; 
    counter <=0; 
    ready <= 0;
  end
  else if (ready == 1'b1) begin
   counter <= counter +1'b1;
   if (counter==5'b10011) begin
     y <= a & b;
     counter <=0;
     ready <= 0; //turn it off after passing to y
   end
  end
 end

always @(a,b) begin
  ready <= 1'b1;
 end

endmodule

    //TestBench
`timescale 1ps/1ps
module tb_count ();

reg a,b;
reg clk;
reg reset;
wire [4:0] counter;
wire y;

initial begin
clk = 1'b1;
reset = 1'b0;
a = 1'b0;
b = 1'b0;
end

always begin
reset <= #50 1'b1;
clk = #250 ~clk;


a <= #1000 1'b1;
b <= #1000 1'b1;
end


count_and count_and_inst (
    .clk(clk),
    .reset(reset),
    .a(a),
    .b(b),
    .y(y),
    .counter(counter)
);

endmodule
...