時鐘輸出
易靈思所有的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的方式。
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’這種定義。
-
GPIO
+關注
關注
16文章
1164瀏覽量
51402 -
易靈思
+關注
關注
5文章
41瀏覽量
4758
發布評論請先 登錄
相關推薦
評論