1. 程式人生 > >FPGA-06-例項化的通俗理解(3-8譯碼器為例)

FPGA-06-例項化的通俗理解(3-8譯碼器為例)

例項化

以下以38線譯碼器實現函式為例:

首先設計一個3線8線譯碼器

module decoder_3_8(

input                           rst_n                           ,

input             [2 :0]      data_in                       ,

output    reg [7 :0]       data_out             

    );

[email protected](*) begin

       if(!rst_n)

              data_out=8'b0;

       else begin

              case(data_in)

              3'b000   : data_out=8'b1111_1110;

              3'b001   : data_out=8'b1111_1101;

              3'b010   : data_out=8'b1111_1011;

              3'b011   : data_out=8'b1111_0111;

              3'b100   : data_out=8'b1110_1111;

              3'b101   : data_out=8'b1101_1111;

              3'b110   : data_out=8'b1011_1111;

              3'b111   : data_out=8'b0111_1111;

              default : data_out=8'b0000_0000;

              endcase        end

end

endmodule

這是你們經常喜歡用的case寫的。下面是RTL圖

 

另一種寫法。

module decoder_3_8(

input             [2 :0]      data_in                       ,

output           [7 :0]      data_out             

    );

assign    data_out[0]= data_in[0]| data_in[1]| data_in[2];

assign    data_out[1]=~data_in[0]| data_in[1]| data_in[2];

assign    data_out[2]= data_in[0]|~data_in[1]| data_in[2];

assign    data_out[3]=~data_in[0]|~data_in[1]| data_in[2];

assign    data_out[4]= data_in[0]| data_in[1]|~data_in[2];

assign    data_out[5]=~data_in[0]| data_in[1]|~data_in[2];

assign    data_out[6]= data_in[0]|~data_in[1]|~data_in[2];

assign    data_out[7]=~data_in[0]|~data_in[1]|~data_in[2];

Endmodule

所以我們採用下面的那種寫法:

module 和endmodule是固定的形式。

decoder_3_8是你所設計的電路的名字。

module decoder_3_8;

endmodule

這兩行程式碼類似於你在一張紙上畫 了框架圖形

 

 

然後繼續畫

(

input             [2 :0]      data_in                       ,

output           [7 :0]      data_out             

    );

這個就是定義你設計的電路模組的輸入和輸出埠,如下:

 

現在你的電路你的電路已經把外殼設計好了,所以需要設計內部的電路了。就是下面的程式碼。就是用語言描述出輸出與輸入的對應關係。

assign    data_out[0]= data_in[0]| data_in[1]| data_in[2];

assign    data_out[1]=~data_in[0]| data_in[1]| data_in[2];

assign    data_out[2]= data_in[0]|~data_in[1]| data_in[2];

assign    data_out[3]=~data_in[0]|~data_in[1]| data_in[2];

assign    data_out[4]= data_in[0]| data_in[1]|~data_in[2];

assign    data_out[5]=~data_in[0]| data_in[1]|~data_in[2];

assign    data_out[6]= data_in[0]|~data_in[1]|~data_in[2];

assign    data_out[7]=~data_in[0]|~data_in[1]|~data_in[2];

這樣就得到了我們的譯碼器。

 

接下來就是用譯碼器來實現函數了,我們以f=m1+m2+m5+m7為例。

要使用譯碼器就需要對他的輸入埠和輸出埠進行一定的連線,我們的輸入就接譯碼器的輸入,譯碼管的輸出如下表

         data_in 

data_out

000

11111110

001

11111101

010

11111011

011

11110111

100

11101111

101

11011111

110

10111111

111

01111111

可以看出當我們的data_out[1]、 data_out[2]、 data_out[5] 、data_out[7]其中一個為零時函式的輸出要為一。

下面是我們的實現函式部分程式碼:

module function_1(

input      [2:0]       data_in                ,

output                  function_out

    );                              

wire[7:0]       data_out                     ;           

      

decoder_3_8       inst1(

.data_in        (data_in        ),

.data_out      (data_out     )     

    );   

assign    function_out=~(data_out[1]&data_out[2]&data_out[5]&data_out[7]);             

endmodule

箭頭指的那些可以全部理解成導線,就是把我們剛剛設計好的譯碼器的輸入和輸出埠用導線進行了一定的連線。

 

可以看到前面這個模組就是我們剛剛設計的譯碼器,後面的就是我們的賦值語句

assign    function_out=~(data_out[1]&data_out[2]&data_out[5]&data_out[7]);      

這樣我們的電路就設計好了。

所謂例項化就是把我們之前設計好的電路,拿過來進行使用,對輸入和輸出進行一定的連線。

各個模組編寫好以後,用頂層的.v檔案進行連線。

說白了就是在PC端進行物理連線的過程。