時(shí)鐘輸出
易靈思所有的GPIO都可以用作時(shí)鐘輸出。這里我們提供兩種時(shí)鐘輸出方式。
方法一:把時(shí)鐘設(shè)置為clkout模式。下圖選自鈦金系列ds上的IO框圖 。從圖片上可以看到OUTCLK的路徑。
在添加 GPIO時(shí),設(shè)置Mode為clkout,并在output Clock中輸入時(shí)鐘名。
這里需要 注意的是,時(shí)鐘名不能從core直接輸出,而只能使用interface中使用的時(shí)鐘,如PLL輸出的時(shí)鐘或者GCLK輸入的時(shí)鐘。比如我們在代碼中定義了一個(gè)IO,如下:
module clk_test(
...
output clk_100m,
...
);
如果直接把代碼中定義的clk_100m直接配置給interface的GPIO,這時(shí)軟件會(huì)報(bào)錯(cuò)。
方法二:
通過DDIO的方式設(shè)置時(shí)鐘輸出。IO模式設(shè)置為output,并打開Register Option及Double Data I/O Option,并指定時(shí)鐘。
程序內(nèi)部分別對DDIO的高低位分部賦值為1或者0.
assign clk_out_inst_HI = 1'b1;
assign clk_out_inst_LO=1'b0;
對于兩種方式的使用,Trion有很大一部分的GPIO不支持DDIO,只能使用第一種方式,鈦金所有的GPIO都支持DDIO;另外在源同步時(shí)鐘數(shù)據(jù)輸出時(shí),DDIO的方式可以保證數(shù)據(jù)和時(shí)鐘的延時(shí)一致,所以易靈思推薦使用DDIO的方式。
Efinity處理三態(tài)端口問題
我們在處理三態(tài)門時(shí)一般都是用下面的語句;
inout bidr_pad;
wirein;
wire out;
wireo_oe;
assign bidr_pad= o_en ? out :z;
assignin=bidr_pad;
其實(shí)它對應(yīng)的硬件結(jié)構(gòu)就是下面的框圖。它涉及到3個(gè)信號:in,out,o_en。
當(dāng)o_en = 1時(shí),out可以通過out buf輸出到pad上,同時(shí)會(huì)反饋到in;
當(dāng)o_en = 0時(shí),out buf就是高阻態(tài)。in的信號就是通過外部pad通過in buf輸入進(jìn)來。
最初使用Efinity,因?yàn)榧軜?gòu)差異,很多人被inout的使用難住了。這里來說明一下。在易靈思的產(chǎn)品架構(gòu)中,原有的rtl代碼都是針對fabric的,也就邏輯部分。而IO被認(rèn)為是外設(shè)。如下圖I/O Buffer部分相對于fabric是外設(shè),它是在Efinity的interface Designer中設(shè)置的。這樣在rtl只需要定義:
inputin;
outputout;
output o_oe;
有了上面的認(rèn)知,我們就容易理解在efinity中怎樣添加三態(tài)。
添加三態(tài)門的過程如下:
我們在interface中添加一個(gè)gpio,命名為sda,把Mode,選擇為inout,
點(diǎn)擊show/Hide GPIO Resource Assigner,打開IO分配界面分配IO.
點(diǎn)擊保存和Generate Efintiy Constraint Files.
打開工程面板下面的Result下的xxx_template.v,可以看到里面添加了
Inputsda_IN,
output sda_OE,
output sda_OUT
三個(gè)信號,把這三個(gè)信號復(fù)制到工程文件的頂層中去,這樣就定義好了一個(gè)inout,可以直接全用了。
另外如果要添加IO寄存可以根據(jù)實(shí)際需要去選擇,同時(shí)要注意為寄存器選擇準(zhǔn)確的時(shí)鐘。
這樣就不用再寫assign sda = oe ? sda_out :z; 這樣的語句,因?yàn)閛e就是sda_OE, sda_out對應(yīng)的就是接口生成的sda_OUT。
在Efinity的.v文件中不支持inout 雙向口的定義,另外Efinity也不支持‘z’這種定義。
-
GPIO
+關(guān)注
關(guān)注
16文章
1215瀏覽量
52232 -
易靈思
+關(guān)注
關(guān)注
5文章
47瀏覽量
4893
發(fā)布評論請先 登錄
相關(guān)推薦
評論