模組的定義以關鍵字module開始,模組名、埠列表、埠宣告和可選的引數宣告必須出現在其他部分的前面,endmodule語句必須為模組的最後一條語句。埠是模組與外部環境互動的通道,只有在模組有埠的情況下才需要有埠列表和埠宣告。模組內部的5個組成部分是:變數宣告、資料流語句、低層模組例項、行為語句塊以及任務和函式。
埠埠是模組與外界環境互動的介面。對外部環境來講,模組內部是不可見的,對模組的呼叫只能通過其埠進行。這種特點為設計者提供了很大的靈活性:只要介面保持不變,模組內部的修改並不會影響到外部環境。常將埠成為終端。(terminal)
埠列表:
在模組的定義中包括乙個可選的埠列表。如果模組和外部環境沒有交換任何訊號,則可以沒有埠列表。
埠宣告
埠列表中的所有埠必須在模組中進行宣告,verilog中的埠具有以下三種了型別:input、output、和inout。在verilog中,所有的埠隱含地宣告為wire型別,因此如果希望埠具有wire資料型別,將其宣告為三種型別之一即可:如果輸出型別的埠需要儲存數值,則必須將其顯式的宣告為reg資料型別。
不能將input和inout型別的埠宣告為reg資料型別,這是因為reg型別的變數是用於儲存數值的,而輸入埠只反映與其相連的外部訊號的變化,並不能儲存這些訊號的值。
注意,在verilog中,也可以使用ansi c風格進行埠宣告。這種風格的宣告的優點是避免了埠名在埠列表和埠宣告語句中的重複。如果宣告中未指明埠的資料型別,那麼預設埠具有wire資料型別。
如:module fulladd4(output reg [3:0] sum,
output reg c_out,
input [3:0] a,b,
input c_in);
endmodule
埠連線規則
將乙個埠看成由相互鏈結的兩個部分組成,一部分位於模組內部,另一部分位於模組外部。當在乙個模組中呼叫(例項引用)另乙個模組時,埠之間的連線必須遵守一些規則。
輸入埠:從模組內部來講,輸入埠必須為線網資料型別,從模組外部來看,輸入埠可以連線到線網或者reg資料型別的變數。
輸出埠:從模組內部來講,輸出埠可以是線網或者reg資料型別,從模組外部來看,輸出必須連線到線網型別的變數,而不能連線到reg型別的變數。
呼叫子模組時 輸出埠只能用wire型別變數進行對映 這是verilog語法規定的
不知道你說的「無法實現想要的功能」是指什麼 但是如果你需要輸出訊號是reg型別
可以增加乙個wire型別中間變數 再把這個中間變數賦值給乙個reg型別變數
wire a;
testmodule tss(dataa,a,clockk);
reg registerr;
always @ *
registerr <= a;
輸入/輸出埠
從模組內部來講,輸入/輸出埠必須為線網資料型別;從模組外部來看,輸入/輸出埠也必須連線到線網型別的變數。
位寬匹配
在對模組進行呼叫的時候,verilog允許埠的內、外兩個部分具有不同的位寬。一般情況下,verilog**器會對此警告。
未連線埠
verilog允許模組例項的埠保持未連線的狀態。例如,如果模組的某些輸出埠只用於除錯,那麼這些埠可以不與外部訊號連線。
埠與外部訊號的連線
在對模組呼叫的時候,可以使用兩種方法將模組定義的埠與外部環境中的訊號連線起來:按順序連線以及按名字連線。但兩種方法不能混合在一起使用。
順序埠連線:
需要連線到模組例項的訊號必須與模組宣告時目標埠在埠列表中的位置保持一致。
inout引腳:
1.fpga io在做輸入時,可以用作高阻態,這就是所說的高阻輸入;
2.fpga io在做輸出時,則可以直接用來輸入輸出。
晶元外部引腳很多都使用inout型別的,為的是節省管腿。就是乙個埠同時做輸入和輸出。 inout在具體實現上一般用三態門來實現。三態門的第三個狀態就是高阻'z'。當inout埠不輸出時,將三態門置高阻。這樣訊號就不會因為兩端同時輸出而出錯了,更詳細的內容可以搜尋一下三態門tri-state的資料.
1 使用inout型別資料,可以用如下寫法:
inout data;
reg data_in;
reg data_out;
//data為輸出時
reg en_output;
assign data_inout=en_output?data_out:1'bz;//en_output控制三態門
//對於data_out,可以通過組合邏輯或者時序邏輯根據data對其賦值.通過控制en_output的高低電平,從而設定data是輸出資料還是處於高阻態,如果處於高阻態,則此時當作輸入埠使用.en_output可以通過相關電路來控制.
2 編寫測試模組時,對於inout型別的埠,需要定義成wire型別變數,而其它輸入埠都定義成reg型別,這兩者是有區別的.
當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其餘情況可以斷開.
此時可以用assign語句實現:assign data_inout=link?data_in_t:1'bz;
其中的link ,data_in_t是reg型別變數,在測試模組中賦值.
另外,可以設定乙個輸出埠觀察data_inout用作輸出的情況:
wire data_out;
assign data_out_t=(!link)?data_inout:1'bz;
但要注意給data_inout賦值的時候,link選通訊號如何給呢?
首先測試檔案給原始檔的data_inout資料賦值,那只能在原inout資料為高阻態的時候才可以賦值,故link訊號即該inout資料為高阻太時的控制訊號。
當不需要測試檔案給你data_inout資料賦值的時候,測試檔案的data_inout介面因為高阻態,從而不影響原始檔data_inout介面的其他操作。
Verilog 模組和埠
模組定義以關鍵字module開始,模組名 埠列表 埠宣告和可選的引數宣告必須出現在其他部分的前面,endmodule語句必須為模組的最後一條語句。模組內部的5個組成部分是 變數宣告 資料流語句 低層模組例項 行為語句塊以及任何和函式。在模組的組成部分中,只有module 模組名 endmodule必...
Verilog的模組與埠 語法
模組 模組的定義以關鍵字module開始,模組名 埠列表 埠宣告和可選的引數宣告必須出現在其他部分的前面,endmodule語句必須為模組的最後一條語句。埠是模組與外部環境互動的通道,只有在模組有埠的情況下才需要有埠列表和埠宣告。模組內部的5個組成部分是 變數宣告 資料流語句 低層模組例項 行為語句...
verilog讀書筆記 4 模組和埠
模組定義以關鍵字module開始,模組名 埠列表 埠宣告和可選的引數宣告必須出現在其他部分的前面,endmodule語句必須為模組的最後一條語句。模組內部的5個組成部分是 變數宣告 資料流語句 低層模組例項 行為語句塊以及任何和函式。在模組的組成部分中,只有module 模組名 endmodule必...