题解 | #异步复位的串联T触发器#
异步复位的串联T触发器
https://www.nowcoder.com/practice/9c8cb743919d405b9dac28eadecddfb5
`timescale 1ns/1ns
module Tff_2 (
input wire data, clk, rst,
output reg q
);
//*************code***********//
reg q1;
always @(posedge clk or negedge rst) begin
if(!rst) begin
q1 <= 1'b0;
q <= 1'b0;
end
else begin
if(data) begin
q1 <= ~q1;
if(q1)
q <= ~q;
else
q <= q;
end
else begin
q1 <= q1;
if(q1)
q <= ~q;
else
q <= q;
end
end
end
//*************code***********//
endmodule
T触发器概念
T触发器(Toggle Flip-Flop,or Trigger Flip-Flop)只有一个信号输入端T,在时钟有效边沿(上升沿/下降沿)到来时,T端输入有效信号,则触发器翻转,否则触发器保持不变。触发器的输出信号有一个,当T端为0时,输出取Q,当T端为1时,取Q的反相Q_bar。
T触发器特征方程
T触发器的特征表
触发器的输出信号有一个,当T端为0时,输出取Q,当T端为1时,取Q的反相Q_bar
本题是两个T触发器的叠加,前一个触发器的输出给到后一个触发器的输入
data对Q过程的影响会在下一个时钟周期
Q过程对Q输出的影响也会在下一个时钟周期
Testbench
`timescale 1ns/1ns
module testbench();
reg clk=0;
always #5 clk = ~clk; // Create clock with period=10
// A testbench
reg rst;
reg data;
parameter MAX_NUM = 5;
reg [2:0] num;
wire q;
initial begin
rst <= 1'b0;
data <= 1'b0;
num <= 3'b0;
#10;
rst = ~rst;
#200 $finish;
end
//data
always @(negedge clk or negedge rst) begin
if(!rst) begin
data <= 1'b0;
num <= 3'b0;
end
else begin
if(num == MAX_NUM - 1) begin
data <= ~data;
num <= 3'b0;
end
else begin
num <= num + 1;
data <= data;
end
end
end
//dut
Tff_2 Tff_2_inst(
.clk(clk),
.rst(rst),
.data(data),
.q(q)
);
//end
initial begin
$dumpfile("out.vcd");
// This will dump all signal, which may not be useful
//$dumpvars;
// dumping only this module
//$dumpvars(1, testbench);
// dumping only these variable
// the first number (level) is actually useless
$dumpvars(0, testbench);
end
endmodule
Verilog小白 文章被收录于专栏
记录自学Verilog的过程
汤臣倍健公司氛围 416人发布