`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 if(data) begin
q1 <= !q1;
if(q1) begin
q <= !q;
end
else begin
q <= q;
end
end
else if(!data) begin
q1 <= q1;
if(q1) begin
q <= !q;
end
else begin
q <= q;
end
end
end
//------------------code-------------------
endmodule
`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 if(data) begin
q1 <= !q1;
if(q1) begin
q <= !q;
end
else begin
q <= q;
end
end
else if(!data) begin
q1 <= q1;
if(q1) begin
q <= !q;
end
else begin
q <= q;
end
end
end
//------------------code-------------------
endmodule
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;
end
else begin
if(data)
q1 <= ~q1;
else
q1 <= q1;
end
end
always @(posedge clk or negedge rst) begin
if(!rst) begin
q <= 1'b0;
end
else begin
if(q1)
q <= ~q;
else
q <= q;
end
end
//------------------code-------------------
endmodule
更倾向于接法2,将两个触发器分开写复位和触发信号。
:::info
- 异步复位需要一个时钟和复位的边沿信号来触发;
- 复位信号是高电平或低电平有效?需要观察波形来决定;
- 如果要检测这个电平,就需要通过边沿进入电平触发来检测异步复位;
- T触发器和D触发器的基本理解;
- 异步复位是如何实现的:
在always块的敏感事件列表中,如果去掉复位信号,那么检测到复位信号的时候就不再会进行触发,只有在if语句中检测到复位信号才会触发复位。
- 如果复位信号是低电平复位,那么应当在标准的复位信号应当是rst_n,n表示negedge。 ::: 如果要改成同步复位,那么去掉敏感时间列表中的复位信号即可。