题解 | #异步复位的串联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的过程