存储单元
在逻辑综合中可以推断出两种存储元素,即触发器和锁存器。 本节介绍这两个元素之间的实现和比较
1、不同类型触发器的RTL模板
从RTL中综合出的触发器或锁存器的类型取决于它们的代码风格。 以下是几个不同触发器和锁存器的RTL示例。 在触发器RTL中,posedge clk推断出正边沿触发器,negedge clk推断出负边沿触发器。
1.简单的D触发器
module dff(clk,d,q) ;
input clk ,d ;
output q ;
reg q ;
always@(posedge clk ) begin
q <= d ;
end
endmodule
在SystemVerilog中,可以使用always\_ff代替always实现相同的代码,如下所示:
always_ff @(posedge clk) begin
q<= d ;
end
2.异步置位触发器
正边沿触发,高电平有效异步置位
module asff(clk,d,set,q) ;
input clk ,d,set ;
ouput q ;
reg q ;
always@(posedge clk or posedge set) begin
if(set) begin
q <= 1’b1 ;
end
else begin
q <= d ;
end
end
endmodule
3.异步复位触发器
正边沿触发,高电平有效异步复位
module arff(clk ,d,reset,q) begin
input clk ,d,reset ;
output q ;
reg q ;
always@(posedge clk or posedge reset) begin
if(reset) begin
q <= 1’b0 ;
end
else begin
q <= d ;
end
end
endmodule
4.异步置位和复位触发器
正边沿触发,高电平有效的异步置位,复位
module arsff(clk,d,set,reset) ;
input clk ,d,set,reset ;
output q ;
reg q ;
always@(posedge clk or posedge set or posedge reset) begin
if(set) begin
q <= 1’b1 ;
end
else if(reset) begin
q <= 1’b0 ;
end
else begin
q<= d ;
end
end
endmodule
5、同步置位触发器
正边沿触发,高电平有效的同步置位
module ssff(clk , d,set,q) ;
input clk ,d,set ;
output q ;
reg q ;
always@(posedge clk ) begin
if(set) begin
q <= 1’b1 ;
end
else begin
q <= d ;
end
end
endmodule
6、同步复位触发器
正边沿触发,高电平有效的同步复位
module srff(
input clk ,d,reset ;
output q );
reg q ;
always@(posedge clk ) begin
if(reset) begin
q <= 1’b0 ;
end
else begin
q <= d ;
end
end
endmodule
7、同步置位和复位触发器
正边沿触发,高电平有效的同步置位和复位
module ssrff(
input clk ,
input d ,
input set ,
input reset ,
output q ) ;
reg q ;
always@(posedge clk) begin
if(set) begin
q <= 1’b1 ;
end
else if(reset) begin
q <= 1’b0 ;
end
else begin
q <= d ;
end
endmodule
不同类型锁存器的RTL模板
1、 简单的D锁存器
module d1(sel ,d ,q) ;
input sel ,d ;
output q ;
reg q ;
always@(*) begin
if(sel) begin
q <=d ;
end // note the else is missing
end
endmodule
在systemverilog中可以用always\_latch代替always,无需指定敏感列表。
always_latch // no explicit sensitivity list
If(sel) begin
q <= d ;
end
2. 异步置位锁存器
module asl (sel,d,set,q) ;
input sel ,d ,set;
output q ;
reg q ;
always@(*) begin
if(set) begin
q = 1’b1 ;
end
else if(sel) begin
q = d ;
end
end
endmodule
3、异步复位锁存器
module arl(sel,d,reset,q) ;
input sel , d ,reset ;
output q ;
reg q ;
always@(*) begin
if(reset) begin
q = 1’b0 ;
end
else if(sel) begin
q = d ;
end
end
endmodule
4、异步复位置位锁存器
module asrl(sel ,d, set,reset,q) ;
input sel ,d,set,reset ;
output q ;
reg q ;
always@(*) begin
if(reset) begin
q = 1’b0 ;
end
else if(set) begin
q = 1’b1 ;
end
else if(sel) begin
q =d ;
end
end
endmodule
以上所有示例都是一位存储元件。可以增加reg声明的位宽来增加触发器或锁存器的宽度。例如,
reg [3:0] out1;
这将创建4位触发器或锁存器。
触发器中异步或同步复位,哪一个更好?
异步复位:
1、复位信号不是数据路径中的一部分
2、复位能在任何时候发生
3、不建议由内部逻辑生成异步复位
示例:
always@(posedge clk or negedge reset) begin
if(!reset) begin
out1 <= 0 ;
end
else begin
out1 <= in1 ;
end
end
同步复位:
1、复位信号是数据路径的一部分
2、复位只能在时钟的有效边沿发生
3、可以由内部逻辑生成同步复位
示例:
always@(posedge clk ) begin
if(!reset) begin
out2 <= 0 ;
end
else begin
out2 <= in2 ;
end
end
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏