FPGA-06-例項化的通俗理解(3-8譯碼器為例)
例項化
以下以3線8線譯碼器實現函式為例:
首先設計一個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端進行物理連線的過程。