D触发器
描述:clk
上升沿赋值,其他时候保持
。具体看以下几种D触发器
类型。
D触发器:基本
module DFF(
output reg Q,
input D,clk /*不带复位*/
);
always @(posedge clk) begin
Q <= D;
end
endmodule
D触发器:带三态控制位
module DFF_3(
output reg [7:0] q, /*数据输出端*/
input [7:0] d, /*数据输入端*/
input en, clk /*三态控制端,时钟信号*/
);
always @(posedge clk) begin
if(en)
q <= 8'bz;
else
q <= d;
end
endmodule
D触发器: 异步清0,异步置1
module DFF_async(
input clk, reset, /*clk和reset*/
input d, /*数据输入端*/
input set, /*置1使能位,低电平有效*/
output reg q, qn /*输出端*/
);
always @(posedge clk) begin
if(!reset) begin
q <= 0; /*异步清0, 低电平有成效*/
qn <= 1;
end
else if(!set) begin
q <= 1; /*异步置1,低电平有效*/
qn <= 0;
end
else begin
q <= d;
qn <= ~d;
end
end
endmodule
D触发器:同步清0,同步置1
module DFF_sync(
input clk, reset, /*clk和reset*/
input d, /*数据输入端*/
input set, /*置1使能位,低电平有效*/
output reg q, qn /*输出端*/
);
always @(posedge clk) begin
if(reset) begin
q <= 0; /*同步清0, 高电平有成效*/
qn <= 1;
end
else if(set) begin
q <= 1; /*同步置1,高电平有效*/
qn <= 0;
end
else begin
q <= d;
qn <= ~d;
end
end
endmodule
JK触发器
描述:jk触发器
功能是比较齐全的,具有置1
,置0
,保持
和翻转
功能
JK触发器:基本
module JK(
input clk,
input j, k,
output reg q
);
always @(posedge clk) begin
case({j, k})
2'b00: q <= q; /*保持*/
2'b01: q <= 0; /*置0*/
2'b10: q <= 1; /*置1*/
2'b11: q <= ~q; /*翻转*/
default: q <= q;
endcase
end
endmodule
JK触发器:异步清0,异步置1
module JK(
input clk, set, rs
input j, k,
output reg q
);
always @(posedge clk) begin
if(!rs) q <= 1'b0;
else if(!set) q <= 1'b1;
else
case({j, k})
2'b00: q <= q; /*保持*/
2'b01: q <= 0; /*置0*/
2'b10: q <= 1; /*置1*/
2'b11: q <= ~q; /*翻转*/
default: q <= q;
endcase
end
endmodule
SR锁存器
描述:具有复位(reset)
和置位(set)
,以及保持
功能
module rs(
input clk,
input r, s,
output reg q,
output wire qb
);
always @(posedge clk) begin
case({r, s})
2'b00: q <= q; /*保持*/
2'b01: q <= 1; /*置1*/
2'b10: q <= 0; /*复位*/
2'b11: q <= 1'bx; /*不允许同时为1*/
endcase
end
endmodule
T触发器
描述:在T
使能控制下,翻转
功能,在T
失效时,具有保持
功能
module T(
input clk,
input t,
output reg q
);
always @(posedge clk) begin
if(t) q <= ~q; /*翻转*/
//else q <= 1; /*保持*/
end
endmodule
8位数据寄存器
简单的D触发器
,综合出来就是个寄存器
module reg8(
input clk, clr,
input [7:0] data_in,
output reg [7:0] data_out
);
alwyas @(posedge clk) begin
if(clr) data_out <= 0;
else data_out <= data_in;
end
endmodule
8位移位寄存器
描述:总共需要8clk
,将数据存储(如果外部只有1bit
输入端)
module reg8_shifter(
input clk, clr,
input din,
output reg [7:0] data_out
);
alwyas @(posedge clk) begin
if(clr) data_out <= 0; /*清零*/
else begin
data_out <= (data_out<<1);
data_out[0] <= data_in;
end
end
endmodule
或者使用拼接
module reg8_shifter(
input clk, clr,
input din,
output reg [7:0] data_out
);
alwyas @(posedge clk) begin
if(clr) data_out <= 0; /*清零*/
else
data_out <= {data_in[6:0], data_in};
end
endmodule
仿真波形(两种写法的波形是一样的):