D Trava
Um flip-flop captura dados em sua entrada na borda positiva ou negativa de um clock. O importante a ser observado é que o que quer que aconteça com os dados após a transição do clock até a próxima transição do clock não será refletido na saída. Uma trava por outro lado, não captura na borda de um clock, em vez disso, a saída segue a entrada enquanto o pino de habilitação estiver ativado.
Projeto
Neste exemplo, construiremos uma trava que tem três entradas e uma saída. A entrada d significa dados que podem ser 0 ou 1, rstn significa reset ativo-baixo e en significa enable que é usado para fazer os dados de entrada travarem na saída. O reset sendo ativo-baixo significa simplesmente que o elemento de design será resetado quando esta entrada for para 0 ou em outras palavras, o reset estará ativo quando seu valor for baixo. O valor da saída q é ditado pelas entradas d , pt e primeiro .
module d_latch ( input d, // 1-bit input pin for data
input en, // 1-bit input pin for enabling the latch
input rstn, // 1-bit input pin for active-low reset
output reg q); // 1-bit output pin for data output
// This always block is "always" triggered whenever en/rstn/d changes
// If reset is asserted then output will be zero
// Else as long as enable is high, output q follows input d
always @ (en or rstn or d)
if (!rstn)
q <= 0;
else
if (en)
q <= d;
endmodule
Observe que a lista de sensibilidade para o
always
bloco contém todos os sinais necessários para atualizar a saída. Este bloco será acionado sempre que qualquer um dos sinais da lista de sensibilidade alterar seu valor. Também q obterá o valor de d somente quando en é alto e, portanto, é um positivo robusto. Esquema
Banco de teste
module tb_latch;
// Declare variables that can be used to drive values to the design
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instantiate design and connect design ports with TB signals
d_latch dl0 ( .d (d),
.en (en),
.rstn (rstn),
.q (q));
// This initial block forms the stimulus to test the design
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Initialize testbench variables
d <= 0;
en <= 0;
rstn <= 0;
// 2. Release reset
#10 rstn <= 1;
// 3. Randomly change d and enable
for (i = 0; i < 5; i=i+1) begin
delay = $random;
delay2 = $random;
#(delay2) en <= ~en;
#(delay) d <= i;
end
end
endmodule
Para tornar nossos sinais de afirmação e desativação do testbench de maneira mais aleatória, declaramos um
reg
variável chamada delay de tamanho 3 bits para que possa assumir qualquer valor de 0 a 7. Em seguida, o delay variável é usada para atrasar a atribuição de d e pt para obter padrões diferentes em cada loop. Saída
Registro de simulaçãoncsim> run [0] en=0 d=0 q=0 [11] en=1 d=0 q=0 [18] en=0 d=0 q=0 [19] en=0 d=1 q=0 [20] en=1 d=1 q=1 [25] en=1 d=0 q=0 [27] en=0 d=0 q=0 [32] en=0 d=1 q=0 [33] en=1 d=1 q=1 [34] en=1 d=0 q=0 ncsim: *W,RNQUIE: Simulation is complete.
Clique na imagem para aumentá-la.
Verilog