一、異步信號(hào)同步器設(shè)計(jì)
1、復(fù)位的設(shè)計(jì):采用異步復(fù)位,,同步釋放電路
http://www.cnblogs.com/qiweiwang/archive/2010/11/25/1887888.html
2,、異步信號(hào)同步器:
http://www./analog/apply/ybxhtbqsj_60096_2.html
①電平同步器
1 module synzer_ls(
2 data_out,
3 clk1,
4 clk2,
5 data_in
6 ); //level signal synchronizer
7
8 output data_out; // signal that after synchronized
9 input clk1; // old clk signal
10 input clk2; // new clk signal
11 input data_in; // signal that before synchronized
12
13 reg a; // DFF in the old clk domain
14 reg b; // the first DFF in the new clk domain
15 reg c; // the second DFF in the new clk domain
16
17 always @(posedge clk1) //a
18 a<=data_in;
19
20 always @(posedge clk2) //b
21 b<=a;
22
23 always @(posedge clk2) //c
24 c<=b;
25
26 assign data_out=c;
27
28 endmodule
?、谶呇貦z測同步器
1 module synzer_ed(
2 data_out,
3 clk1,
4 clk2,
5 data_in
6 ); // edge detecting synchronizer
7
8 output data_out; // signal that after synchronized
9 input clk1; // old clk signal
10 input clk2; // new clk signal
11 input data_in; // signal that before synchronized
12
13 reg a; // DFF in the old clk domain
14 reg b; // the first DFF in the new clk domain
15 reg c; // the second DFF in the new clk domain
16 reg d; // the third DFF in the new clk domain
17
18 always @(posedge clk1) //a
19 a<=data_in;
20
21 always @(posedge clk2) //b
22 b<=a;
23
24 always @(posedge clk2) //c
25 c<=b;
26
27 always @(posedge clk2) //d
28 d<=c;
29
30 assign data_out=c&&(~d);
31
32 endmodule
?、勖}沖檢測同步器
1 module synzer_pl(
2 data_out,
3 clk1,
4 clk2,
5 data_in,
6 rst_n
7 ); // pulse synchronizer
8
9 output data_out; // signal that after synchronized
10 input clk1; // old clk signal
11 input clk2; // new clk signal
12 input data_in; // signal that before synchronized
13 input rst_n; // signal indicating reset
14
15 reg a; // DFF in the old clk domain
16 reg b; // the first DFF in the new clk domain
17 reg c; // the second DFF in the new clk domain
18 reg d; // the third DFF in the new clk domain
19
20 wire q;
21 wire q1;
22 wire di;
23
24 assign di=data_in?q1:q;
25 assign q=a;
26 assign q1=~a;
27 assign data_out=(c==d)?0:1;
28
29 always @(posedge clk1) //a
30 begin
31 if(!rst_n)
32 a<=1'b0;
33 else
34 a<=di;
35 end
36
37 always @(posedge clk2) //b
38 b<=a;
39
40 always @(posedge clk2) //c
41 c<=b;
42
43 always @(posedge clk2) //d
44 d<=c;
45
46 endmodule
二、常用觸發(fā)器實(shí)現(xiàn)
http://www./article/08-03/37231s.html
2.6.1 Verilog基本模塊
1.觸發(fā)器的Verilog實(shí)現(xiàn)
時(shí)序電路是高速電路的主要應(yīng)用類型,,其特點(diǎn)是任意時(shí)刻電路產(chǎn)生的穩(wěn)定輸出不僅與當(dāng)前的輸入有關(guān),,而且還與電路過去時(shí)刻的輸入有關(guān)。時(shí)序電路的基本單元就是觸發(fā)器,。下面介紹幾種常見同步觸發(fā)器的Verilog實(shí)現(xiàn),。
RS觸發(fā)器分為同步觸發(fā)器和異步觸發(fā)器,二者的區(qū)別在于同步觸發(fā)器有一個(gè)時(shí)鐘端clk,,只有在時(shí)鐘端的信號(hào)上升(正觸發(fā))或下降(負(fù)觸發(fā))時(shí),,觸發(fā)器的輸出才會(huì)發(fā)生變化。下面以正觸發(fā)為例,,給出其Verilog代碼實(shí)現(xiàn)。
例2-15 正觸發(fā)型同步RS觸發(fā)器的Verilog實(shí)現(xiàn),。
module sy_rs_ff (clk, r, s, q, qb); input clk, r, s; output q, qb; reg q;
assign qb = ~ q; always @(posedge clk) begin case({r, s}) 2'b00: q <= 0; 2'b01: q <= 1; 2'b10: q <= 0; 2'b11: q <= 1'bx; endcase end endmodule
上述程序經(jīng)過綜合Synplify Pro后,,其RTL級(jí)結(jié)構(gòu)如圖2-2所示。
圖2-2 同步RS觸發(fā)器的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-3所示
圖2-3 同步RS觸發(fā)器的仿真結(jié)果示意圖
T觸發(fā)器也分為同步觸發(fā)器和異步觸發(fā)器,,二者的區(qū)別在于同步T觸發(fā)器多了一個(gè)時(shí)鐘端。同步T觸發(fā)器的邏輯功能為:當(dāng)時(shí)鐘clk沿到來時(shí),,如果T=0,,則觸發(fā)器狀態(tài)保持不變;否則,,觸發(fā)器輸出端反轉(zhuǎn),。R為復(fù)位端,當(dāng)其為高電平時(shí),,輸出Q與時(shí)鐘無關(guān),,Q=0。
例2-16 同步T觸發(fā)器的Verilog實(shí)現(xiàn),。
module sy_t_ff(clk, r, t, q, qb); input clk, r, t; output q, qb; reg q;
assign qb = ~q; always @(posedge clk) begin if(r) q <= 0; else q <= ~q; end endmodule
上述程序經(jīng)過綜合Synplify Pro后,,其RTL級(jí)結(jié)構(gòu)如圖2-4所示。
圖2-4 同步T觸發(fā)器電路的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-5所示
圖2-5 同步T觸發(fā)器的仿真結(jié)果示意圖
同步D觸發(fā)器的功能為: D輸入只能在時(shí)序信號(hào)clk的沿變化時(shí)才能被寫入到存儲(chǔ)器中,,替換以前的值,常用于數(shù)據(jù)延遲以及數(shù)據(jù)存儲(chǔ)模塊中。
例2-17 同步D觸發(fā)器的Verilog實(shí)現(xiàn),。
module sy_d_ff(clk, d, q, qb); input clk, d; output q, qb; reg q;
assign qb = ~q; always @(posedge clk) begin q <= d; end endmodule
上述程序經(jīng)過綜合Synplify Pro后,,其RTL級(jí)結(jié)構(gòu)如圖2-6所示。
圖2-6 同步D觸發(fā)器的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-7所示
圖2-7 同步D觸發(fā)器的仿真結(jié)果示意圖
JK觸發(fā)器是在RS觸發(fā)器的基礎(chǔ)上發(fā)展而來的,,常用于實(shí)現(xiàn)計(jì)數(shù)器。當(dāng)clk=0時(shí),,觸發(fā)器不工作,,處于保持狀態(tài)。當(dāng)時(shí)鐘clk=1時(shí),,觸發(fā)器的功能如下:當(dāng)JK為00,、01以及10時(shí)實(shí)現(xiàn)RS觸發(fā)器的功能;當(dāng)JK為11時(shí)實(shí)現(xiàn)T觸發(fā)器的功能,。
例2-18 同步JK觸發(fā)器的Verilog實(shí)現(xiàn),。
module sy_jk_ff(clk, j, k, q, qb); input clk, i, k; output q, qb; reg q;
assign qb = ~q; always @(posedge clk) begin case({j, k}) 2'b00: q <= q; 2'b01: q <= 0; 2'b10: q <= 1; 2'b11: q <= ~q; endcase end endmodule
上述程序經(jīng)過綜合Synplify Pro后,其RTL級(jí)結(jié)構(gòu)如圖2-8所示,。
圖2-8 同步JK觸發(fā)器的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-9所示
圖2-9 同步JK觸發(fā)器的仿真結(jié)果示意圖
2.三態(tài)緩沖器的Verilog實(shí)現(xiàn)
三態(tài)緩沖器也稱三態(tài)門,其典型應(yīng)用是雙向端口,,常用于雙向數(shù)據(jù)總線的構(gòu)建,。在數(shù)字電路中,邏輯輸出有兩個(gè)正常態(tài):低電平狀態(tài)(對(duì)應(yīng)邏輯0)和高電平狀態(tài)(對(duì)應(yīng)邏輯1),;此外,,電路還有不屬于0和1狀態(tài)的高組態(tài)(對(duì)應(yīng)于邏輯Z)。所謂高阻,,即輸出端屬于浮空狀態(tài),,只有很小的漏電流流動(dòng),其電平隨外部電平高低而定,,門電平放棄對(duì)輸出電路的控制,。或者可以理解為輸出與電路是斷開的,。最基本的三態(tài)緩沖器的邏輯符號(hào)如圖2-10所示,。
圖2-10 三態(tài)緩沖器的邏輯符號(hào)圖
當(dāng)OE為高電平時(shí),Dataout與Datain相連,;而OE為低時(shí),,Dataout為高阻態(tài),相當(dāng)于和Datain之間的連線斷開,。
例2-19 使用Verilog實(shí)現(xiàn)三態(tài)緩沖器
inout a; wire z, b; //當(dāng)控制信號(hào)z為1時(shí),,開通三態(tài)門,,b為輸入端口;當(dāng)z為0時(shí),,三態(tài)門為高阻,, //a為輸出端口 assign a = (z) ? b : 8'bz;
3.38譯碼器的Verilog實(shí)現(xiàn)
38譯碼器是通過3條線來達(dá)到控制8條線的狀態(tài),就是通過3條控制線不同的高低電平組合, 一共可以組合出23=8種狀態(tài),。在電路中主要起到擴(kuò)展IO資源的作用,。當(dāng)然,可根據(jù)實(shí)際需求將38譯碼器擴(kuò)展到更高級(jí)數(shù)上,。
例2-20 使用Verilog實(shí)現(xiàn)38譯碼器
module decoder3to8(din, reset, dout); input [2:0] din; input reset; output [7:0] dout;
reg [7:0] dout; always @(din or reset) begin if(!reset) dout = 8'b0000_0000; else case(din) 3'b000: dout = 8'b0000_0001; 3'b001: dout = 8'b0000_0010; 3'b010: dout = 8'b0000_0100; 3'b011: dout = 8'b0000_1000; 3'b100: dout = 8'b0001_0000; 3'b101: dout = 8'b0010_0000; 3'b110: dout = 8'b0100_0000; 3'b111: dout = 8'b1000_0000; endcase end
endmodule
上述程序經(jīng)過綜合Synplify Pro后,,其RTL級(jí)結(jié)構(gòu)如圖2-11所示。
圖2-11 38譯碼器的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-12所示
圖2-12 38譯碼器的仿真結(jié)果示意圖
2.6.2 基本時(shí)序處理模塊
1.奇,、偶數(shù)分頻電路
在數(shù)字邏輯電路設(shè)計(jì)中,分頻器是一種基本電路,。通常用來對(duì)某個(gè)給定頻率進(jìn)行分頻,,以得到所需的頻率。
偶數(shù)倍分頻是最簡單的一種分頻模式,,完全可通過計(jì)數(shù)器計(jì)數(shù)實(shí)現(xiàn),。如要進(jìn)行N倍偶數(shù)分頻,那么可由待分頻的時(shí)鐘觸發(fā)計(jì)數(shù)器計(jì)數(shù),,當(dāng)計(jì)數(shù)器從0計(jì)數(shù)到N/2-1時(shí),,輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),并給計(jì)數(shù)器一個(gè)復(fù)位信號(hào),,使得下一個(gè)時(shí)鐘從零開始計(jì)數(shù),以此循環(huán)下去,。這種方法可以實(shí)現(xiàn)任意的偶數(shù)分頻,。例2-21給出的是一個(gè)16分頻電路,其它倍數(shù)的分頻電路可通過修改計(jì)數(shù)器的上限值得到,。
例2-21 用Verilog實(shí)現(xiàn)一個(gè)16分頻電路,。
module clk_div16(clk_in, reset, clk_out); input clk_in; input reset; output clk_out;
reg clk_out; reg [2:0] cnt; always @(posedge clk_in) begin if(!reset) begin cnt <= 0; clk_out <= 0; end else if(cnt == 7) begin cnt <= 0; clk_out <= !clk_out; end else begin cnt <= cnt + 1; clk_out <= clk_out; end end
endmodule
上述程序經(jīng)過綜合Synplify Pro后,其RTL級(jí)結(jié)構(gòu)如圖2-13所示,。
圖2-13 16分頻電路的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-14所示,從中可以看出例2-21成功實(shí)現(xiàn)了輸入時(shí)鐘的16分頻,。
圖2-14 16分頻電路的仿真結(jié)果示意圖
奇數(shù)倍分頻有多種實(shí)現(xiàn)方法,,下面介紹常用的錯(cuò)位“異或”法的原理。如進(jìn)行三分頻,,通過待分頻時(shí)鐘上升沿觸發(fā)計(jì)數(shù)器進(jìn)行模三計(jì)數(shù),,當(dāng)計(jì)數(shù)器計(jì)數(shù)到鄰近值進(jìn)行兩次翻轉(zhuǎn),。比如在計(jì)數(shù)器計(jì)數(shù)到1時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),,計(jì)數(shù)到2時(shí)再次進(jìn)行翻轉(zhuǎn),,即在鄰近的1和2時(shí)刻進(jìn)行兩次翻轉(zhuǎn)。這樣實(shí)現(xiàn)的三分頻占空比為1/3或者2/3,。如果要實(shí)現(xiàn)占空比為50%的三分頻時(shí)鐘,,可以通過待分頻時(shí)鐘下降沿觸發(fā)計(jì)數(shù),和上升沿同樣的方法計(jì)數(shù)進(jìn)行三分頻,,然后將下降沿產(chǎn)生的三分頻時(shí)鐘和上升沿產(chǎn)生的時(shí)鐘進(jìn)行相或運(yùn)算,,即可得到占空比為50%的三分頻時(shí)鐘。 這種錯(cuò)位“異或”法可以推廣實(shí)現(xiàn)任意的奇數(shù)分頻:對(duì)于實(shí)現(xiàn)占空比為50%的N倍奇數(shù)分頻,,首先進(jìn)行上升沿觸發(fā)的模N計(jì)數(shù),,計(jì)數(shù)到某一選定值時(shí)進(jìn)行輸出時(shí)鐘翻轉(zhuǎn),然后經(jīng)過(N-1)/2再次進(jìn)行翻轉(zhuǎn)得到一個(gè)占空比非50%奇數(shù)N分頻時(shí)鐘,。再者同時(shí)進(jìn)行下降沿觸發(fā)的模N計(jì)數(shù),,到和上升沿觸發(fā)輸出時(shí)鐘翻轉(zhuǎn)選定值相同值時(shí),進(jìn)行輸出時(shí)鐘時(shí)鐘翻轉(zhuǎn),,同樣經(jīng)過(N-1)/2時(shí),,輸出時(shí)鐘再次翻轉(zhuǎn)生成占空比非50%的奇數(shù)N分頻時(shí)鐘。兩個(gè)占空比非50%的N分頻時(shí)鐘相或運(yùn)算,,得到占空比為50%的奇數(shù)N分頻時(shí)鐘,。
例2-22 使用Verilog實(shí)現(xiàn)3分頻電路。
module clk_div3(clk_in, reset, clk_out); input clk_in; input reset; output clk_out;
reg [1:0] cnt, cnt1; reg clk_1to3p, clk_1to3n; always @(posedge clk_in) begin if(!reset) begin cnt <= 0; clk_1to3p <= 0; end else begin if(cnt == 2'b10) begin cnt <= 0; clk_1to3p <= clk_1to3p; end else begin cnt <= cnt + 1; clk_1to3p <= !clk_1to3p; end end end
always @(negedge clk_in) begin if(!reset) begin cnt1 <= 0; clk_1to3n <= 0; end else begin if(cnt1 == 2'b10) begin cnt1 <= 0; clk_1to3n <= clk_1to3n; end else begin cnt1 <= cnt1 + 1; clk_1to3n <= !clk_1to3n; end end end
assign clk_out = clk_1to3p | clk_1to3n;
endmodule
上述程序經(jīng)過綜合Synplify Pro后,,其RTL級(jí)結(jié)構(gòu)如圖2-15所示,。
圖2-15 3分頻電路的RTL結(jié)構(gòu)圖
在ModelSim 6.2b中完成仿真,其結(jié)果如圖2-16所示,,可以看到輸出時(shí)鐘為占空比為50%的3分頻時(shí)鐘,。
圖2-16 3分頻電路的仿真結(jié)果
2.同步采樣模塊
在實(shí)際應(yīng)用中,外部輸入的異步信號(hào)需要經(jīng)過系統(tǒng)時(shí)鐘的同步化,,且將輸入的異步信號(hào)整形成一個(gè)時(shí)鐘長的脈沖信號(hào),,如圖2-17所示。這里以例2-23來說明實(shí)現(xiàn)的方法,。
圖2-17 異步信號(hào)的同步采樣示意圖
例2-23 使用Verilog將外部異步信號(hào)進(jìn)行同步整形,。
module clk_syn(clk, reset, s_in, s_out); input clk; input reset; input s_in; output s_out;
reg s_t1, s_t2; always @(posedge clk) begin if(!reset) begin s_t1 <= 0; s_t2 <= 0; end else begin s_t1 <= s_in; s_t2 <= s_t1; end end
assign s_out = s_t1 & (!s_t2);
endmodule
上述程序經(jīng)過綜合Synplify Pro后,其RTL級(jí)結(jié)構(gòu)如圖2-18所示,。從結(jié)果上看,,該電路非常簡單,但需要一定的時(shí)序邏輯能力才能真正理解該段程序,。
圖2-18 同步電路的RTL結(jié)構(gòu)示意圖
在ModelSim 6.2b中完成仿真,,其結(jié)果如圖2-19所示,,將不等長的高電平信號(hào)整形成寬度為一個(gè)時(shí)鐘周期的脈沖信號(hào)。
圖2-19 同步電路的仿真結(jié)果示意圖
其中,,如果在時(shí)鐘的上升沿din="1",,則x=1,y=0,,dout=x and (not y)=1,;如果din="1"超過一個(gè)時(shí)鐘寬度,則x=1,,y=1,,dout=x and (not y)=0。即使din在時(shí)鐘周期內(nèi)出現(xiàn)抖動(dòng),,也不會(huì)影響輸出結(jié)果,,還是被整形成一個(gè)時(shí)鐘寬度。所以不管是長周期信號(hào)還是短周期信號(hào),,經(jīng)過同步采樣后,,有效高電平寬度都等于時(shí)鐘周期。
3.同步狀態(tài)機(jī)的Verilog實(shí)現(xiàn)
狀態(tài)機(jī)一般包括組合邏輯和寄存器邏輯兩部分,。組合電路用于狀態(tài)譯碼和產(chǎn)生輸出信號(hào),,寄存器用于存儲(chǔ)狀態(tài)。狀態(tài)機(jī)的下一個(gè)狀態(tài)及輸出不僅與輸入信號(hào)有關(guān),,還與寄存器當(dāng)前狀態(tài)有關(guān),。根據(jù)輸出信號(hào)產(chǎn)生方法的不同,狀態(tài)機(jī)可分為米里(Mealy)型和摩爾(Moore)型,。前者的輸出是當(dāng)前狀態(tài)和輸入信號(hào)的函數(shù),,后者的輸出僅是當(dāng)前狀態(tài)的函數(shù)。在硬件設(shè)計(jì)時(shí),,根據(jù)需要決定采用哪種狀態(tài)機(jī),。
狀態(tài)編碼又稱狀態(tài)分配。通常有多種編碼方法,,編碼方案選擇得當(dāng),,設(shè)計(jì)的電路可以簡單,;反之,,電路會(huì)占用過多的邏輯或速度降低。設(shè)計(jì)時(shí),,須綜合考慮電路復(fù)雜度和電路性能這兩個(gè)因素,。下面主要介紹二進(jìn)制編碼、格雷編碼和獨(dú)熱碼,。
二進(jìn)制編碼和格雷碼都是壓縮狀態(tài)編碼,。二進(jìn)制編碼的優(yōu)點(diǎn)是使用的狀態(tài)向量最少,,但從一個(gè)狀態(tài)轉(zhuǎn)換到相鄰狀態(tài)時(shí),可能有多個(gè)比特位發(fā)生變化,,瞬變次數(shù)多,,易產(chǎn)生毛刺。格雷編碼在相鄰狀態(tài)的轉(zhuǎn)換中,,每次只有1個(gè)比特位發(fā)生變化,,雖減少了產(chǎn)生毛刺和一些暫態(tài)的可能,但不適用于有很多狀態(tài)跳轉(zhuǎn)的情況,。
獨(dú)熱碼是指對(duì)任意給定的狀態(tài),,狀態(tài)向量中只有1位為1,其余位都為0,。n狀態(tài)的狀態(tài)機(jī)需要n個(gè)觸發(fā)器,。這種狀態(tài)機(jī)的速度與狀態(tài)的數(shù)量無關(guān),僅取決于到某特定狀態(tài)的轉(zhuǎn)移數(shù)量,,速度很快,。當(dāng)狀態(tài)機(jī)的狀態(tài)增加時(shí),如果使用二進(jìn)制編碼,,那么狀態(tài)機(jī)速度會(huì)明顯下降,。而采用獨(dú)熱碼,雖然多用了觸發(fā)器,,但由于狀態(tài)譯碼簡單,,節(jié)省和簡化了組合邏輯電路。獨(dú)熱編碼還具有設(shè)計(jì)簡單,、修改靈活,、易于綜合和調(diào)試等優(yōu)點(diǎn)。對(duì)于寄存器數(shù)量多,、而門邏輯相對(duì)缺乏的FPGA器件,,采用獨(dú)熱編碼可以有效提高電路的速度和可靠性,也有利于提高器件資源的利用率,。獨(dú)熱編碼有很多無效狀態(tài),,應(yīng)該確保狀態(tài)機(jī)一旦進(jìn)入無效狀態(tài)時(shí),可以立即跳轉(zhuǎn)到確定的已知狀態(tài),。
- 有限狀態(tài)機(jī)的Verilog實(shí)現(xiàn)
用Verilog 語言描述有限狀態(tài)機(jī)可使用多種風(fēng)格,,不同的風(fēng)格會(huì)極大地影響電路性能。通常有3種描述方式:單always塊,、雙always塊和三always塊,。
單always塊把組合邏輯和時(shí)序邏輯用同一個(gè)時(shí)序always塊描述,其輸出是寄存器輸出,,無毛刺,。但是這種方式會(huì)產(chǎn)生多余的觸發(fā)器,,代碼難于修改和調(diào)試,應(yīng)該盡量避免使用,。 雙always塊大多用于描述Mealy狀態(tài)機(jī)和組合輸出的Moore狀態(tài)機(jī),,時(shí)序always塊描述當(dāng)前狀態(tài)邏輯,組合邏輯always塊描述次態(tài)邏輯并給輸出賦值,。這種方式結(jié)構(gòu)清晰,,綜合后的面積和時(shí)間性能好。但組合邏輯輸出往往會(huì)有毛刺,,當(dāng)輸出向量作為時(shí)鐘信號(hào)時(shí),,這些毛刺會(huì)對(duì)電路產(chǎn)生致命的影響。 三always塊大多用于同步Mealy狀態(tài)機(jī),,兩個(gè)時(shí)序always塊分別用來描述現(xiàn)態(tài)邏輯和對(duì)輸出賦值,,組合always塊用于產(chǎn)生下一狀態(tài)。這種方式的狀態(tài)機(jī)也是寄存器輸出,,輸出無毛刺,,并且代碼比單always塊清晰易讀,但是面積大于雙always塊,。隨著芯片資源和速度的提高,,目前這種方式得到了廣泛應(yīng)用。 下面以三always塊模塊給出狀態(tài)機(jī)的Verilog模板,。
// 構(gòu)成狀態(tài)跳轉(zhuǎn)環(huán) always @(posedge clk or negedge rst_n) current_state <= next_state;
// 完成狀態(tài)機(jī)的內(nèi)部邏輯 always @ (current_state or ) begin case(current_state) S1: next_state = S2; S2: next_state = S1; default: next_state = S2; endcase end
// 完成狀態(tài)機(jī)的外部邏輯 always @(current_state or ) begin case(current_state) S1: S2: default: endcase end
在硬件描述語言中,,許多基于仿真的語句雖然符合語法規(guī)則,但是不能映射到硬件邏輯電路單元,,如果要最終實(shí)現(xiàn)硬件設(shè)計(jì),,必須寫出可以綜合的程序。通常,,綜合的原則為:
- 綜合之前一定要進(jìn)行仿真,,仿真會(huì)暴露邏輯錯(cuò)誤。如果不做仿真,,沒有發(fā)現(xiàn)的邏輯錯(cuò)誤會(huì)進(jìn)入綜合器,,使綜合的結(jié)果產(chǎn)生同樣的邏輯錯(cuò)誤。
- 每一次布線之后都要進(jìn)行仿真,,在器件編程或流片之前一定要進(jìn)行最后的仿真,。
- 用Verilog HDL描述的異步狀態(tài)機(jī)是不能綜合的,應(yīng)該避免用綜合器來設(shè)計(jì),。在必須設(shè)計(jì)異步狀態(tài)機(jī)時(shí),,建議用電路圖輸入的方法
- 狀態(tài)機(jī)應(yīng)該有一個(gè)異步或同步復(fù)位端,,以便在通電時(shí)將硬件電路復(fù)位到有效狀態(tài),。建議使用異步復(fù)位以簡化硬件開銷,。
- 時(shí)序邏輯電路建模時(shí),用非阻塞賦值,。用always塊寫組合邏輯時(shí),,采用阻塞賦值。不要在多個(gè)always塊中為同一個(gè)變量賦值,。
- always塊中應(yīng)該避免組合反饋回路,。在賦值表達(dá)式右端參與賦值的信號(hào)都必須出現(xiàn)在敏感信號(hào)列表中,否則在綜合時(shí),,會(huì)為沒有列出的信號(hào)隱含地產(chǎn)生一個(gè)透明鎖存器,。
三、其他
鑒相:
濾波:
|