1. 题目
2.T触发器
T触发器逻辑功能为:当T=0时,触发器状态不变Qn+1=Qn;而当T=1时,在脉冲有效边沿到来时翻转。触发器的特性表如表1-1所示:
表1-1:
T | Qn+1 |
0 | Qn |
1 | ~Qn |
3. RTL 代码
思路:例化两个T触发器。
`timescale 1ns/1ps
module Tff_2
(
input clk ,
input rst ,
input data ,
output q
);
//output of U1 to U2 input
wire q_temp;
Tff Tff_U1 (.clk(clk), .rst_n(rst), .t(data), .q(q_temp));
Tff Tff_U2 (.clk(clk), .rst_n(rst), .t(q_temp), .q(q));
endmodule
//**** Tff design ****//
module Tff
(
input wire clk ,
input wire rst_n ,
input wire t ,
output reg q
);
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
q <= 1'b0;
end else if (t) begin
q <= ~q;
end else begin
q <= q;
end
end
endmodule
4.Tb
`timescale 1ns/1ps
module tb();
reg clk;
reg rst_n;
reg data;
wire q;
/*-------------------------------------\
data | q_temp | q
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
\-------------------------------------*/
//***** generate clk *****//
always begin
#10 clk = ~clk; //clk is 20ns
end
initial begin
clk = 1'b1;
rst_n = 1'b1;
data = 1'b0;
repeat(10) @(posedge clk);
rst_n = 1'b0;
repeat(5) @(posedge clk);
rst_n = 1'b1;
//***** fixed testing *****//
repeat(5)begin
case_4(data,1);
end
repeat(5)begin
case_4(data,0);
end
repeat(5)begin
case_4(data,1);
end
//***** random testing *****//
repeat(100)begin
case_random(data);
end
repeat(100) @(posedge clk);
$finish();
end
//***** task define *****//
task case_4;
output a;
input b;
case(b)
0: #20 a = 0;
1: #20 a = 1;
endcase
endtask
task case_random;
output a;
a = #20 {$random} % 2;
endtask
always@(posedge clk)begin
$display("data = %d; q_temp = %d; q = %d",data, Tff_2.q_temp, q);
end
//***** generate .fsdb *****//
initial begin
$fsdbDumpfile("tb.fsdb");
$fsdbDumpvars(0,tb);
end
Tff_2 U1
(
.clk (clk) ,
.rst (rst_n) ,
.data (data) ,
.q (q)
);
endmodule
5. 仿真结果