Кольцевые прилавки в 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