Кольцевые прилавки в verilog

Я пытаюсь создать 4-битный счетчик, используя D-триггеры в Verilog. Я следую за этой схемой http://i.imgur.com/VR5593a.png. Я получил код для отдельного D-триггера. У меня проблема с D0 в первом такте. Я предполагаю, что сначала я должен принять Q0 равным 1, а Q1, Q2, Q3 сначала равным 0. Я не уверен, как передать начальное значение для D0 только один раз в коде.

module DFlipFlop(CLK, D, Q);
  input CLK, D;
  output Q;
  reg Q;
  always @(posedge CLK) begin
    Q <= D;
      end
endmodule

module RippleMod(CLK, q0, q1, q2, q3);
  input CLK;
  output q0, q1, q2, q3;

  DFlipFlop d1 (CLK,q3,q0);//not sure about q3 there, think I will get X if i do this.
  DFlipFlop d2 (CLK,q0,q1);
  DFlipFlop d3 (CLK,q1,q2);
  DFlipFlop d4 (CLK,q2,q4);
endmodule

4 ответа

Использование сигнала сброса поможет вам. Так что вам просто нужно сбросить Q3 на 1, а остальные сигналы на 0.

verilog инициализирует все переменные с 4 состояниями в "x". Таким образом, вы могли бы запустить 'x' вокруг цикла навсегда без каких-либо реальных изменений. Вы должны предоставить информацию по вашему делу. что-то вроде следующего (в SV)

module RippleMod(CLK, en, in, q0, q1, q2, q3);
  input CLK, en, in;
  output q0, q1, q2, q3;
  logic d1in;
  always_ff @(negedge clk) begin
    if (en)
       d1in <= in;
    else
       d1in <= q3;
  end

  DFlipFlop d1 (CLK,d1in,q0);
  DFlipFlop d2 (CLK,q0,q1);
  DFlipFlop d3 (CLK,q1,q2);
  DFlipFlop d4 (CLK,q2,q4);
endmodule

Вам нужно что-то сделать, чтобы установить начальное состояние.

Для моделирования вы обычно можете использовать "начальные" блоки для установки начального состояния регистров. Некоторые инструменты синтеза, особенно те, которые предназначены для FPGA /CPLD, также поддерживают установку начальных состояний таким образом. Некоторые инструменты синтеза, которые не поддерживают начальные блоки, могут поддерживать специфический для инструмента способ установки начальных условий.

Другой вариант - встроить линию сброса в свои триггеры. Недостатком этого является, конечно, то, что вам нужно что-то для запуска линии сброса, либо ваш тестовый стенд в симуляции, либо какое-то оборудование в реальной реализации.

Сначала вам нужно инициализировать счетчик звонков, иначе выход останется в неопределенном состоянии xxxx. Попробуйте приведенный ниже код, где ffs явно инициализируются с использованием асинхронного сигнала загрузки...

      module shiftreg;
reg [3:0] in;
output [3:0] q;
reg clk, ld, rst;



dff D0 (q[3], clk, rst, 1'b1, q[0]);
dff D1 (q[0], clk, rst, 1'b0, q[1]);
dff D2 (q[1], clk, rst, 1'b0, q[2]);
dff D3 (q[2], clk, rst, 1'b0, q[3]);


initial clk = 0;
initial forever #5 clk = ~clk;
initial begin
    $monitor($time, "ld = %b  q = %b", ld, q);
    #100 $finish;
end
endmodule

module dff (d, clk, rst, ld, q);
input d, clk, ld, rst;
output reg q;

initial if (ld) q <= 1; else q <=0;

always @ (posedge clk)
if (rst == 1)
q <= 0;
else q <=d;
endmodule
Другие вопросы по тегам