Your IP : 216.73.216.95
// Verilog HDL for "gates.lib", "tff" "_functional"
// Module T flip-flop
module tff (in, out, nout);
input
in;
output
out, nout;
reg
out, nout;
parameter
t_separation = 10,
delay=15,
warning_file=3; // multichannel description of a warning file
reg
t_state, // internal state of T flip-flop
sep_clr; // signal marking the end of the min separation zone
// for the last pulse
integer
last_t_time, // time when the last t pulse appeared
in_sep; // number of pulses within an interval t_sep before
// the last data pulse;
initial
begin
// clear internal registers and the output signal
t_state = 0;
in_sep = 0;
sep_clr = 0;
out = 0;
nout = 0;
end
always @(posedge in)
begin
out <= #delay (in_sep > 0) ? 1'bx : t_state;
out <= #(delay+2) 0;
nout <= #delay (in_sep > 0) ? 1'bx : ~t_state;
nout <= #(delay+2) 0;
if (in_sep == 0)
t_state <= t_state ^ in;
else
begin
t_state = 1'bx;
// generating a warning
$fwrite(warning_file,
"Violation of separation time in module %m.\n");
$fwrite(warning_file,
"Input T pulses at %0d and at %0d.\n", last_t_time,
$stime);
end
last_t_time <= $stime;
in_sep <= in_sep + 1;
sep_clr <= #(t_separation-1) 1;
end
always @(posedge sep_clr)
begin
in_sep <= in_sep - 1;
sep_clr <= 0;
end
endmodule