FPGA研究ノート(1)-12-19

1.ブロッキングとノンブロッキング:

      1.ブロック割り当ての実行は、1ステップのみの操作と見なすことができます。つまり、RHSの値を計算し、LHSを更新します。このとき、他のステートメントからの干渉は許可されません。記号=    
      2. ノンブロッキング割り当ては、クロックビートによって決まり、クロックが立ち上がると、割り当てステートメントの右側が実行され、次に、開始ステートメントと終了ステートメントの間のすべての割り当てステートメントが、割り当てステートメントの左側に同時に割り当てられます。

 

assignステートメントとalwaysの違い
           割り当てステートメントは、クロックでは使用できません。
           alwaysステートメントは、クロックの有無に関係なく使用できます。常にクロックがない場合、ロジック機能と割り当てはまったく同じであり、組み合わせロジックのみを生成します。単純な組み合わせロジックにはassignステートメントが推奨され、より複雑な組み合わせロジックにはalwaysステートメントが推奨されます。

 

 ラッチ ラッチを指します
          パルスレベルに敏感なメモリセル回路。ラッチとレジスタはどちらも基本的なストレージユニットであり、ラッチはレベルトリガーメモリであり、レジスタはエッジトリガーメモリです。2つの基本的な機能は同じで、どちらもデータを保存できます。ラッチは組み合わせロジックによって生成されますが、レジスタは順序回路で使用され、クロックトリガーによって生成されます。
ラッチの主な危険性はグリッチであり、設計では、ラッチの使用をできるだけ回避する必要があります。
        コードでラッチが発生する2つの理由は、組み合わせロジックのifまたはcaseステートメントの記述が不完全であることです。たとえば、elseブランチがなく、caseがデフォルトブランチがない場合、ラッチはコード合成プロセスに表示されます。解決策は、elseブランチをもたらす必要がある場合、caseがデフォルトのブランチをもたらす必要があることです。
        クロックのないalwaysステートメントのifまたはcaseステートメントのみが不完全である場合にのみラッチが生成され、クロックのあるifまたはcaseステートメントのステートメントでは不完全な場合にラッチが生成されないことに注意してください。
 

状態機械

Mealy ステートマシン:組み合わせロジックの出力は、現在の状態だけでなく、入力状態にも依存します。
ムーア ステートマシン:組み合わせロジックの出力は、現在の状態にのみ依存します。
3ステージステートマシン:
       1ステージ:状態マシン全体がalwaysモジュールに書き込まれます。このモジュールでは、状態遷移と、状態の入力および出力が記述されます。この種類のステートマシンはお勧めできません。コードスタイルの観点から、組み合わせロジックとシーケンシャルロジックを分離する必要があるためです。コードのメンテナンスとアップグレードの観点から、組み合わせロジックとシーケンシャルロジックの組み合わせは、コードのメンテナンスと変更に役立ちません。また、拘束を助長しません。
        2段階:2つのalwaysモジュールを使用して状態マシンを記述します。1つのalwaysモジュールは同期タイミングを使用して状態遷移を記述し、もう1つのモジュールは組み合わせロジックを使用して状態遷移条件を決定し、状態遷移規則と出力を記述します。1ステージステートマシンとは異なり、現在の状態と2番目の状態の2つの状態を定義し、現在の状態と2番目の状態を変換することでシーケンシャルロジックを実現する必要があります。
        3段階:2つのalwaysモジュール記述方法に基づいて、3つのalwaysモジュールが使用されます。1つは常に同期タイミングを使用して状態遷移を記述し、1つは常に組み合わせロジックを使用して状態遷移条件を決定し、状態遷移規則を記述し、もう1つは常に状態遷移条件を記述します。ステータス出力(組合せ回路または順序回路による出力が可能)。
        3ステージステートマシンの基本的な形式は次のとおりです。
            最初のalwaysステートメントは、同期状態のジャンプを実現します。
            2番目のalwaysステートメントは、組み合わせロジックを使用して状態遷移条件を決定します。
            3番目のalwaysステートメントは、状態出力を記述します(組み合わせ回路による出力または順序回路による出力が可能です)。
            状態機械のコードを書く前に、一般に最初に状態遷移図を描いてください。そうすれば、コードを書くときにアイデアがより明確になります。
例として7による除算を考えてみましょう
 
1 module divider7_fsm (
2 //系统时钟与复位
3 input sys_clk , 
4 input sys_rst_n , 
5 
6 //输出时钟
7 output reg clk_divide_7 
8 );
9 
10 //parameter define 
11 parameter S0 = 7'b0000001; //独热码定义方式
12 parameter S1 = 7'b0000010;
13 parameter S2 = 7'b0000100;
14 parameter S3 = 7'b0001000;
15 parameter S4 = 7'b0010000;
16 parameter S5 = 7'b0100000;
17 parameter S6 = 7'b1000000; 
18 
19 //reg define 
20 reg [6:0] curr_st ; //当前状态
21 reg [6:0] next_st ; //下一个状态
22
23 //*****************************************************
24 //** main code
25 //***************************************************** 
26
27 //状态机的第一段采用同步时序描述状态转移
28 always @(posedge sys_clk or negedge sys_rst_n) begin
29 if (!sys_rst_n)
30 curr_st <= S0;
31 else
32 curr_st <= next_st;
33 end
34
35 //状态机的第二段采用组合逻辑判断状态转移条件
36 always @(*) begin
37 case (curr_st)
38 S0: next_st = S1;
39 S1: next_st = S2;
40 S2: next_st = S3;
41 S3: next_st = S4;
42 S4: next_st = S5;
43 S5: next_st = S6;
44 S6: next_st = S0;
45 default: next_st = S0;
46 endcase
47 end
48
49 //状态机的第三段描述状态输出(这里采用时序电路输出)
50 always @(posedge sys_clk or negedge sys_rst_n) begin
51 if (!sys_rst_n)
52 clk_divide_7 <= 1'b0;
53 else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))
54 clk_divide_7 <= 1'b0;
55 else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))
56 clk_divide_7 <= 1'b1; 
57 else
58 ;
59 end
60
61 endmodule

モジュール設計
        一般にトップダウン設計を採用
 
ファイルは、トップのサンプルのファシリテーターモジュールに置くことができ ます。     
          上の図の左側は、サブモジュール、さまざまな入力および出力インターフェイスの定義です
          上の図の右側は、サブモジュール名を含む最上位モジュールのインスタンス化に対応しています。インスタンス化されたモジュール名(自由に記述できます。通常は、u_ + sub-module nameと名付けます。サブモジュールポートは、サブモジュール関数ポートと一致している必要があります。インスタンス化されたモジュールポートは、TOPレイヤーのポート定義と一致しています。つまり、対応する接続​​が行われます。
 
次の図に示すように、パラメーターのインスタンス化は、パラメーターのインスタンス化がモジュールのインスタンス化に基づいており、パラメーターの信号定義を追加しています。
   

     
パラメータをインスタンス化するときは、モジュール名の後に「#」を追加して、パラメータリストが続くことを示します。タイミングモジュールで定義されたMAX_NUMと最上位モジュールのTIME_SHOWはどちらも25000_000です。最上位モジュールでTIME_SHOW = 12500_000が定義されている場合、サブモジュールのMAX_NUMの値は実際には12,500_000になります。もちろん、サブモジュールにパラメータが含まれている場合でも、モジュールのインスタンス化時にパラメータのインスタンス化を追加する必要はありません。この場合、サブモジュールのパラメータ値は、モジュール内で実際に定義されている値と同じです。
 
Verilog文法におけるlocalparamの意味もパラメータの定義です。使用法は基本的にパラメータと同じです。違いは、パラメータによって定義されたパラメータはインスタンス化できるのに対し、localparamによって定義されたパラメータはローカルパラメータを参照することです。上位モジュールはlocalparamによって定義されたパラメータを実行できません。インスタンス化
                                       
 

 


 

おすすめ

転載: blog.csdn.net/qq_25479231/article/details/103608291