久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Verilog實(shí)現(xiàn)FPGA常用的電路

 aixuexidewau1 2019-04-19

一、異步信號(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

  ①電平同步器

復(fù)制代碼
 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
復(fù)制代碼

 

 ?、谶呇貦z測同步器

  

復(fù)制代碼
 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
復(fù)制代碼

 

 ?、勖}沖檢測同步器

復(fù)制代碼
 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ù)制代碼

 

 二、常用觸發(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ā)器

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ā)器

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觸發(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ā)器

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ù)分頻電路

偶數(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ù)倍分頻有多種實(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)編碼又稱狀態(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 

  •  綜合狀態(tài)機(jī)的一般原則

在硬件描述語言中,,許多基于仿真的語句雖然符合語法規(guī)則,但是不能映射到硬件邏輯電路單元,,如果要最終實(shí)現(xiàn)硬件設(shè)計(jì),,必須寫出可以綜合的程序。通常,,綜合的原則為:

  1. 綜合之前一定要進(jìn)行仿真,,仿真會(huì)暴露邏輯錯(cuò)誤。如果不做仿真,,沒有發(fā)現(xiàn)的邏輯錯(cuò)誤會(huì)進(jìn)入綜合器,,使綜合的結(jié)果產(chǎn)生同樣的邏輯錯(cuò)誤。 
  2.  每一次布線之后都要進(jìn)行仿真,,在器件編程或流片之前一定要進(jìn)行最后的仿真,。 
  3.  用Verilog HDL描述的異步狀態(tài)機(jī)是不能綜合的,應(yīng)該避免用綜合器來設(shè)計(jì),。在必須設(shè)計(jì)異步狀態(tài)機(jī)時(shí),,建議用電路圖輸入的方法
  4. 狀態(tài)機(jī)應(yīng)該有一個(gè)異步或同步復(fù)位端,,以便在通電時(shí)將硬件電路復(fù)位到有效狀態(tài),。建議使用異步復(fù)位以簡化硬件開銷,。
  5. 時(shí)序邏輯電路建模時(shí),用非阻塞賦值,。用always塊寫組合邏輯時(shí),,采用阻塞賦值。不要在多個(gè)always塊中為同一個(gè)變量賦值,。
  6.  always塊中應(yīng)該避免組合反饋回路,。在賦值表達(dá)式右端參與賦值的信號(hào)都必須出現(xiàn)在敏感信號(hào)列表中,否則在綜合時(shí),,會(huì)為沒有列出的信號(hào)隱含地產(chǎn)生一個(gè)透明鎖存器,。 

三、其他

鑒相:

  

濾波:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多