1、DDIO用法
2、時鐘輸出
3、Efinity處理三態端口問題
4、PLL的添加
5、HSIO的解串器用法
1、DDIO用法
對于輸入輸出IO很多時候會用到DDIO的用法。對于DDIO,就是時鐘的雙沿采集或者發送數據,所以必須要用到寄存器。它的設置也比較簡單,在intefaceDesigner中添加GPIO,并把register Option設置為register,另外要設置Double Data IO Option模式,分別為normal和resync。
下圖是易靈思的GPIO的結構。
對應上圖我們以ODDIO為例,分別標出了reg1,reg2和reg3三個寄存 器。當OUT0為上升沿的觸發信號,即HI,OUT1為下降沿的觸發信號,即LO。當DDIO模式設置為Normal mode時,OUT1經過reg3輸出;當設置為Resync mode時OUT1經過了reg2和reg3,reg2用于對數據打一拍來對齊數據,下面是數據的輸出波形。
我們只需要在top模塊中添加相應信號即可以用于控制:
module DDIO_Test(
...
otuputoddio_HI,
output oddio_LO,
...
);
下圖為數據輸入時的波形,分別對應 Normal和Resync mode。
2、時鐘輸出
易靈思所有的GPIO都可以用作時鐘輸出。這里我們提供兩種時鐘輸出方式。
方法一:把時鐘設置為clkout模式。下圖選自鈦金系列ds上的IO框圖 。從圖片上可以看到OUTCLK的路徑。
在添加 GPIO時,設置Mode為clkout,并在output Clock中輸入時鐘名。
這里需要 注意的是,時鐘名不能從core直接輸出,而只能使用interface中使用的時鐘,如PLL輸出的時鐘或者GCLK輸入的時鐘。比如我們在代碼中定義了一個IO,如下:
module clk_test(
...
output clk_100m,
...
);
如果直接把代碼中定義的clk_100m直接配置給interface的GPIO,這時軟件會報錯。
方法二:
通過DDIO的方式設置時鐘輸出。IO模式設置為output,并打開Register Option及Double Data I/O Option,并指定時鐘。
程序內部分別對DDIO的高低位分部賦值為1或者0.
assign clk_out_inst_HI = 1'b1;
assign clk_out_inst_LO=1'b0;
對于兩種方式的使用,Trion有很大一部分的GPIO不支持DDIO,只能使用第一種方式,鈦金所有的GPIO都支持DDIO;另外在源同步時鐘數據輸出時,DDIO的方式可以保證數據和時鐘的延時一致,所以易靈思推薦使用DDIO的方式。
3、Efinity處理三態端口問題
我們在處理三態門時一般都是用下面的語句;
inout bidr_pad;
wirein;
wire out;
wireo_oe;
assign bidr_pad= o_en ? out :z;
assignin=bidr_pad;
其實它對應的硬件結構就是下面的框圖。它涉及到3個信號:in,out,o_en。
當o_en = 1時,out可以通過out buf輸出到pad上,同時會反饋到in;
當o_en = 0時,out buf就是高阻態。in的信號就是通過外部pad通過in buf輸入進來。
最初使用Efinity,因為架構差異,很多人被inout的使用難住了。這里來說明一下。在易靈思的產品架構中,原有的rtl代碼都是針對fabric的,也就邏輯部分。而IO被認為是外設。如下圖I/O Buffer部分相對于fabric是外設,它是在Efinity的interface Designer中設置的。這樣在rtl只需要定義:
inputin;
outputout;
output o_oe;
有了上面的認知,我們就容易理解在efinity中怎樣添加三態。
添加三態門的過程如下:
我們在interface中添加一個gpio,命名為sda,把Mode選擇為inout,
點擊show/Hide GPIO Resource Assigner,打開IO分配界面分配IO.
點擊保存和Generate Efintiy Constraint Files.
打開工程面板下面的Result下的xxx_template.v,可以看到里面添加了
Inputsda_IN,
output sda_OE,
output sda_OUT
三個信號,把這三個信號復制到工程文件的頂層中去,這樣就定義好了一個inout,可以直接全用了。
另外如果要添加IO寄存可以根據實際需要去選擇,同時要注意為寄存器選擇準確的時鐘。
這樣就不用再寫assign sda = oe ? sda_out :z; 這樣的語句,因為oe就是sda_OE, sda_out對應的就是接口生成的sda_OUT。
在Efinity的.v文件中不支持inout 雙向口的定義,另外Efinity也不支持‘z’這種定義。
4、PLL的添加
易靈思的FPGA在生成PLL的方式與別的廠家稍有區別,這與其的core和interface架構是相對應的。對于易靈思的FPGA來講,PLL,GPIO,MIPI,LVDS和DDR相對于core部分都是外設。而這些外設的設置都是在interface designer中的。下面以pll的添加為例,對于trion系列的設置簡單說明。鈦金系列會稍微的區別,但是只要了解了一個,另一個都是大同小異的。
一、PLL的添加
(1)打開interface desinger。
(2)選擇pll右擊選擇Createblock,就可以添加pll
(3)這里我們把pll的例化名修改為pll_inst,并且按回車(必須回車)。
PLL resource對應PLL的位置,這也是易靈思的PLL使用與別家有區別的地方,必須要指定PLL的位置。
clock source是指pll參考時鐘的源來自哪里,包括外部和內部。
External clock:指示參考時鐘的源,包括參考時鐘0,參考時鐘1。
(4)點擊Automated Clock Calculation打開時鐘設置界面。trion最多可以設置3個時鐘,紅包框中的箭頭和x可以用于打開和關閉相應的時鐘。
(5)設置完成上面的操作之后,我們需要指定PLL的參考時鐘來源。從ds上我們可以看到PLL_BL0有兩個時鐘源,分別是REFCLK0和REFCLK1,分別對應GPIOL_15_PLLIN0和GPIOL_19_PLLIN1。
然后再添加PLL的參考時鐘腳,這里我們例化為pll_ref_clk,并要把connection Type設置為pll_clkin。并分配到GPIOL_15_PLLIN0上,因為上面選擇了External Clock0。這樣PLL的設置就差不多了。
二、關于時鐘源
在選擇clock source時,有三個選項,分別是external, core和dynamic。
external好理解,就是參考時鐘從外部IO進入的,上面的設置就是。
core是指時鐘從FPGA內部給PLL的參考,比如一個PLL的輸出給另一個PLL做參考時,第二個PLL的參考就是設置成core,或者從GCLK進入FPGA再環到PLL的輸入。
至于Dynamic Clock就是動態輸入選擇,支持多路選擇,如下圖,可以支持兩個core和兩個external時鐘。但是因為PLL不支持動態重配置,所以這個功能應用有限。
三、PLL的反饋方式
PLL有三種反饋,core,Local和internal。
從下面的圖來看,不同的反饋位置是不一樣的。core的反饋路徑是從FPGA的core內部來反饋,可以保證輸入時鐘與輸出時鐘同頻同相。這在源同步設計中是很有用的。而local和internal可以支持輸出更多的頻率,大家可以在操作中發現如果是core反饋的話,有些頻率是設置不出來的,而local和interanl卻可以。
上面描述其實描述相對粗糙,語句什么的也沒有太去考慮措辭,花半個小時BB下,能用起來就行,如果實在有看不懂的,歡迎留言。
5、HSIO的解串器用法
在interface中添加一個IO,注意要分給HSIO,HVIO是不支持4位解器的。這里我們定義一個iserdes3的GPIO,方向為輸入。
在GPIO的屬性中,打開register,再打開Enable Deserialization就打開了解串器。Serial Clock Pin Name和Clock分別對應解串器的串行和并行時鐘,需要指出的是在使用解串器時不能打開DDIO功能,所以串行時鐘和并行時鐘的關系只是能是4倍關系。
假如串行時鐘是100MHz,那么轉換成的4位并行數據就降速到25MHz。
在設置對應時鐘時會有相位的要求。如果同相位會提示錯誤信息。
保存并點擊生成約束之后,在生成的template文件中就可以看到生成的IO端口已經變成4位位寬。
(* syn_peri_port = 0 *) input [3:0] iserdes3,
-
Interface
+關注
關注
0文章
103瀏覽量
38600 -
desinger
+關注
關注
0文章
1瀏覽量
3414
發布評論請先 登錄
相關推薦
評論