复位处理详细设计方案
一、方案一
?
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這個寄存器就會被優化掉,產生不了該有的作用??梢詫⒋a替換一下然后綜合看下電路,就可以看到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類似。
總結
以上是生活随笔為你收集整理的复位处理详细设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【嵌入式Linux学习七步曲之第五篇 L
- 下一篇: container_of 用法解析