版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网、数据手册、帮助文档、书本以及论文等上的内容,仅供学习交流使用,如有侵权,请联系,我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/85682438
第一种,正儿八经:
带异步复位,同步使能的D触发器:
module dff_reset_en_1seg(
input clk,
input reset,
input en,
input d,
output reg q
);
always @(posedge clk, posedge reset)
begin
if(reset)
q <= 1'b0;
else if(en)
q <= d;
end
endmodule
行为测试:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/01/03 10:39:16
// Design Name:
// Module Name: dff_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module dff_tb;
reg reset;
reg en;
reg CLK;
reg d;
wire q;
// Note: CLK must be defined as a reg when using this method
parameter PERIOD = 10;
always begin
CLK = 1'b0;
#(PERIOD/2) CLK = 1'b1;
#(PERIOD/2);
end
initial begin
reset = 1'b1;
en = 1'b1;
d = 1'b0;
#60
reset = 1'b0;
en = 1'b0;
d = 1'b1;
#100;
en = 1'b1;
d = 1'b1;
end
dff_reset_en_1seg uu1(.clk(CLK), .reset(reset), .en(en),
.d(d), .q(q) );
endmodule
可见,分三个阶段,复位,保持,跟随!
第二种:两段式含异步复位和同步使能的D触发器。
这个触发器没有问题,下面用常规的触发器来实现一个带有异步复位和同步使能的D触发器(练习代码,有点无聊):
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/01/03 10:34:30
// Design Name:
// Module Name: dff_reset_en_1seg
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module dff_reset_en_1seg(
input clk,
input reset,
input en,
input d,
output reg q
);
reg r_reg,r_next;
always @(posedge clk, posedge reset)
begin
if(reset)
r_reg <= 1'b0;
else
r_reg <= r_next;
end
//next-state logic
always @*
begin
if(en)
r_next = d;
else
r_next = r_reg;
end
//output logic
always @*
q = r_reg;
endmodule
这段代码用于实现同样的功能。