一、方案一
1. 复位处理简介:
复位电路一般都是芯片外部管脚直接输入芯片内部的,所以会有毛刺产生,被内部所有有复位功能的寄存器使用,所以地位非常重要,功能就是复位寄存器。
2. 复位处理规格:
复位信号没有毛刺。
3. 实现原理
如下图所示:
rst_p之前的逻辑完成延时的功能,是p_rst_n和p_rst_n的延时信号两个信号相或得到的。然后使用两个寄存器同步到clk时钟域,得到一个没有毛刺的同步复位信号。该复位信号具有同步复位,异步撤离功能。这个功能方便进行STA工具分析。
这种电路的优点是:
l 滤毛刺不需要时钟信号。
l 易于STA(静态时序分析)工具分析。
这种电路的缺点是:
l 组合逻辑滤毛刺风险比较大。
4. Verilog HDL源代码
Verilog HDL代码为:
modulereset_proc (
//input
sys_clk,
p_rst_n,
//output
sys_rst_n
);
//inputports
input sys_clk ; //system clock;
input p_rst_n ; //system port input reset, low is active;
//outputports
output[WIDTH-1:0] sys_rst_n ; //output reset signal ,can be used directlty
//regdefine
reg [WIDTH-1:0] rst_p1 ; //reset signal ,pre 1 cycle
reg [WIDTH-1:0] sys_rst_n ; //real reset signal
//wiredefine
wire [WIDTH-1:0] p_rst_temp1 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp2 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp3 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp4 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp5 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp6 ; //temp wire,connect with buff
wire [WIDTH-1:0] p_rst_temp7 ; //temp wire,connect with buff
//parameterdefine
parameterWIDTH = 1;
parameterSIZE = 8;
/*******************************************************************************************************
** Main Program
**
********************************************************************************************************/
bufBUFF_U0( //BUFF门的实例引用
p_rst_temp1,
p_rst_n
);
bufBUFF_U1( //BUFF门的实例引用
p_rst_temp2,
p_rst_temp1
);
bufBUFF_U2( //BUFF门的实例引用
p_rst_temp3,
p_rst_temp2
);
bufBUFF_U3( //BUFF门的实例引用
p_rst_temp4,
p_rst_temp3
);
bufBUFF_U4( //BUFF门的实例引用
p_rst_temp5,
p_rst_temp4
);
bufBUFF_U5( //BUFF门的实例引用
p_rst_temp6,
p_rst_temp5
);
bufBUFF_U6( //BUFF门的实例引用
p_rst_temp7,
p_rst_temp6
);
assignrst_temp = p_rst_n | p_rst_temp7 ;
//always@(posedge sys_clk or negedge rst_temp) begin
// rst_p1 <= 1'b1;
//end
always@(posedge sys_clk or negedge rst_temp) begin
if (rst_temp ==1'b0) begin
rst_p1 <= 1'b1;
end
else begin
rst_p1 <= 1'b1;
end
end
always@(posedge sys_clk or negedge rst_temp) begin
if (rst_temp ==1'b0) begin
sys_rst_n <= 1'b1;
end
else begin
sys_rst_n <= rst_p1;
end
end
endmodule
//endof RTL code
5. 日积月累
注意下面的代码:
always@(posedge sys_clk or negedge rst_temp) begin
if (rst_temp ==1'b0) begin
rst_p1 <= 1'b1;
end
else begin
rst_p1 <= 1'b1;
end
end
是否可以写为呢?
always@(posedge sys_clk or negedge rst_temp) begin
rst_p1 <= 1'b1;
end
不可以!因为如果写成下面的那样,rst_p1这个寄存器就会被优化掉,产生不了该有的作用。可以将代码替换一下然后综合看下电路,就可以看到rst_p1这个寄存器就会被优化掉了。而上面的代码由于有复位逻辑,所以没有被优化。
门级建模知识
门的类型:(1) 与/或门类(and/or)(2)缓冲器/非门类(buf/not)
与门(and)和或门(or):
与门、或门都有一个标量输出端和多个标量输入端。门的端口列表中的第一个端口必是输出端口,其后为输入端口。当任意一个输入端口的值发生变化时,输出端的值立即重新计算。
verilog中可以使用的属于与/或门类的术语包括:
and nand or nor xor xnor
例:与门/或门的实例引用
wire OUT,IN1,IN2;
and a1(OUT,IN1,IN2); //基本门的实例引用
nand na1_3inp(OUT,IN1,IN2,IN3); //输入端超过两个,三输入与非门
and (OUT,IN1,IN2); //合法的门实例引用,不给实例命名
缓冲器/非门
与and/or门相反,buf/not门具有一个标量输入和多个标量输出。端口列表中的最后一个终端连接至输入端口,其他终端连接至输出端口。对于多个输出端的buf/not门,所有输出端的值都是相同的。
verilog提供了两种基本的门: buf not
在verilog中可以实例引用这些门,注意:buf和not门可以具有多个输出端口,但只能具有一个输入端口,这个输入端口必须是实例端口列表的最后一个。例:
buf b1(OUT1,IN); //基本门的实例引用
not n1(OUT1,IN);
buf b1_2out(OUT1,OUT2,IN); //输出端多于两个
not (OUT1,IN); //实例引用门时,不给实例命名
带控制端的缓冲器/非门(bufif/notif)
bufif1 bufif0 notif1 notif0
这四类门只有在控制信号有效的情况下才能传递数据;如果控制信号无效,则输出为高阻抗Z。
bufif1 b0(out,in,ctrl);
在控制信号有效的情况下,这些门才能传递信号。在某些情况下,例如当一个信号由多个驱动源驱动时,这样设计驱动源:让它们的控制信号的有效时间相互错开,从而避免一条信号线同时被两个源驱动,这时就需要用带控制端的缓冲器/非门来搭建电路。
门延迟
Verilog中允许用户通过门延迟来说明逻辑电路中的延迟,此外用户还可以指定端到端的延迟。
在Verilog门级原语中,有三种从输入到输出的延迟。
1 上升延迟:在门的输入发生变化的情况下,门的输出从0,x,z变化到1所需的时间成为上升延迟。
2 下降延迟:下降延迟是指门的输出从1,x,z变化到0所需的时间。
3 关断延迟:门的输出从0,1,x变化为高阻Z所需的时间。
另外,如果值变化到不确定值x,则所需的时间可以看成是以上三种延迟值中最小的那个。
Verilog中有三种不同的方法来说明门的延迟。如果用户只确定了一个延迟值,那么所有类型的延迟都是用这个延迟值,如果用户指定了两个延迟值,则他们分别代表上升延迟和下降延迟,两者中小者为关断延迟,如果用户指定了三个延迟值,则他们分别代表上升延迟、下降延迟和关断延迟。如果为制定延迟值,那么默认延迟值为0.
延迟声明的例子
and #(3,4,5) b1 (out,in,control); //上升延迟为3,下降延迟为4,关断延迟为5
最小/典型/最大延迟
Verilog中,用户除可以指定上面所述的三种类型的延迟以外,对每种类型的延迟还可以指定其最小值、最大值和典型值。
- 最小值 设计者预期逻辑门所具有的最小延迟
- 典型值 设计者预期逻辑门所具有的典型延迟
- 最大值 设计者预期逻辑门所具有的最大延迟
二、方案二
1. 复位处理简介:
复位电路一般都是芯片外部管脚直接输入芯片内部的,所以会有毛刺产生,被内部所有有复位功能的寄存器使用,所以地位非常重要,功能就是复位寄存器。
2. 复位处理规格:
复位信号没有毛刺。
3. 实现原理
如下图所示:
此种方法通过寄存器延时然后相或得到复位暂存信号,最后再用寄存器打一拍输出,也额可以起到复位处理作用。
这种电路的优点是:
l 可以较稳定的滤毛刺。
l 同步后易于revovery/removel分析。
这种电路的缺点是:
l p_rst_n有效,时钟clk必须有效,否则复位信号不起作用。
4. Verilog HDL源代码
Verilog HDL代码为:
modulereset_proc2 (
//input
sys_clk,
p_rst_n,
//output
sys_rst_n
);
//inputports
input sys_clk ; //system clock;
input p_rst_n ; //system port input reset, low is active;
//outputports
output[WIDTH-1:0] sys_rst_n ; //output reset signal ,can be used directlty
//regdefine
reg [WIDTH-1:0] rst_p1 ; //reset signal ,pre 1 cycle
reg [WIDTH-1:0] sys_rst_n ; //real reset signal
reg [WIDTH-1:0] p_rst_temp1 ; //temp reg
reg [WIDTH-1:0] p_rst_temp2 ; //temp reg
reg [WIDTH-1:0] p_rst_temp3 ; //temp reg
reg [WIDTH-1:0] p_rst_temp4 ; //temp reg
reg [WIDTH-1:0] p_rst_temp5 ; //temp reg
reg [WIDTH-1:0] p_rst_temp6 ; //temp reg
reg [WIDTH-1:0] p_rst_temp7 ; //temp reg
//wiredefine
//parameterdefine
parameterWIDTH = 1;
parameterSIZE = 8;
/*******************************************************************************************************
** Main Program
**
********************************************************************************************************/
always@(posedge sys_clk ) begin
p_rst_temp1 <= p_rst_n;
end
always@(posedge sys_clk ) begin
p_rst_temp2 <= p_rst_temp1;
end
always@(posedge sys_clk ) begin
p_rst_temp3 <= p_rst_temp2;
end
always@(posedge sys_clk ) begin
p_rst_temp4 <= p_rst_temp3;
end
always@(posedge sys_clk ) begin
p_rst_temp5 <= p_rst_temp4;
end
always@(posedge sys_clk ) begin
p_rst_temp6 <= p_rst_temp5;
end
always@(posedge sys_clk ) begin
p_rst_temp7 <= p_rst_temp6;
end
assignrst_temp = p_rst_temp1 | p_rst_temp2 | p_rst_temp3 | p_rst_temp4 | p_rst_temp5| p_rst_temp6 | p_rst_temp7 ;
always@(posedge sys_clk ) begin
sys_rst_n <= rst_temp;
end
endmodule
//endof RTL code
5. 日积月累
异步信号的时序概念
Recoverytime is the minimum length of time an asynchronous control signal, for example,and preset, must be stable before the next active clock edge. The recoveryslack time calculation is similar to the clock setup slack time calculation, butit applies asynchronous control signals.
---
Removaltime is the minimum length of time an asynchronous control signal must bestable after the active clock edge. The TimeQuest analyzer removal time slackcalculation is similar to the clock hold slack calculation, but it appliesasynchronous control signals.
和寄存器的SetUp/HoldUp类似。