2020年2月28日 星期五

Verilog 模組化與階層化

Verilog 模組化與階層化

源自於https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_06.html

輸出入埠敘述

表示法:
module 模組名稱( In1, In2, Out1, Out2, InOut1 );

    input in1, in2;     // 敘述輸出入型態
    output Out1, Out2;
    inout InOut1;

    … … … …

endmodule

Top Module
Module可以有無限多個,但Top Module只能有一個


By Name, In Order
連接module的方式分別有By Name和In Order兩種
指定名稱By Name,依原模組名稱來連接,複雜時較不易出錯
依照順序In Order,依原模組定義之埠列來連接

By Name範例:

// 連接除頻器module
wire _CLK, _RST, _CLKo;

Freq_Divider FD_1Hz(
    .CLK( _CLK ),
    .CLKo( _CLKo ),
    .RST( _RST )
);

In Order範例:

// 連接除頻器module
wire _CLK, _RST, _CLKo;

Freq_Divider FD_1Hz(
    _CLK,
    _RST,
    _CLKo
);

函數Function : 
一定有回傳值 至少要有一個以上的Input
只能有一個Output( 可以使用連接運算子{} )
可引用其他的Function但不能引用Task
不可使用negedge和posedge,且只能合成組合邏輯
只能用於行為層次( Behavior Level ),且不能包含always
範例:

function <資料大小> <函數名稱>;
    input <輸入埠宣告>;
    reg <資料型態宣告>;

    begin
        <敘述>;
    end
endfunction

 任務Task
沒有回傳值 可以擁有零個或數個Input、Output、InOut
可引用其他的Function與Task
不可使用negedge和posedge
只能用於行為層次( Behavior Level ),且不能包含always
範例:

task <任務名稱>;
    input <輸入埠宣告>;
    output <輸出埠宣告>;
    reg <資料型態宣告>;

    begin
        <敘述>;
    end
endtask


實際範例
一位元全加器程式碼:

module Top_Module ( A, B, Cin, Sum, Cout );

    input A, B, Cin;
    output Sum, Cout;

    Full_Adder  FAD  (    // 使用 always 的 Full_Adder
        .A(A),
        .B(B),
        .Cin(Cin),
        .Sum(Sum),
        .Cout(Cout)
    );

endmodule


module Full_Adder ( A, B, Cin, Sum, Cout );

    input A, B, Cin;
    output reg Sum, Cout;

    always @( A, B, Cin ) begin
        { Cout, Sum } = A + B + Cin;
    end

endmodule
//================================
// 時間單位 100ns, 時間精確度10 ps
`timescale 100ns/10ps
module Test_bench;
//     input A, B, Cin;
//     output Sum, Cout;
 
wire Sum, Cout;
reg  A=1'b0;
reg  B=1'b0;
reg  Cin=1'b0;


Top_Module  DUT ( .A(A), .B(B), .Cin(Cin), .Sum(Sum), .Cout(Cout) );

// initial程序結構區塊, 產生A、B輸入信號波形
initial begin

$monitor( A, B, Cin, Sum, Cout );

 #100;    // 100ns
 A=1'b0;   B=1'b0  ; Cin=1'b1 ; // “001”

 #100;    // 200ns
 A=1'b0 ;  B=1'b1 ;  Cin=1'b0 ; // “010”

 #100;    // 300ns
 A=1'b0 ;  B=1'b1  ;   Cin=1'b1 ; // “011"

 #100;    // 400ns
 A=1'b1 ;  B=1'b0  ;   Cin=1'b0 ; // “100"

 #100;    // 500ns
 A=1'b1 ;  B=1'b0  ;   Cin=1'b1 ; // “101"

 #100;    // 600ns
 A=1'b1 ;  B=1'b1  ;   Cin=1'b0 ; // “110"

 #100;    // 700ns
 A=1'b1 ;  B=1'b1  ;   Cin=1'b1 ; // “111"


 end

initial
begin
  #800;   // 模擬終止時間  400 ns
    $stop;
end

endmodule
//================================


沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...