國產FPGA是最近幾年起來的產品,具有性價比高特點。高雲FPGA,很多用戶都用在LED,電機控制,PLC設備上。
開發板子採用GW1N-LV1QN48C6/I5 FPGA器件。具有低功耗,瞬時啓動,高安全性,低成本,方便擴展等特點。本開發板價格價格便宜,板子擴張性容易,幫助用戶比較快遞進入國產FPGA學習能力。
開發板集成多個GPIO接口和多個LVDS接口,電壓可以從3.3,2.5,1.8,1.2V選擇。用戶可以選擇不同電壓適配不同的IO口。其中每個VCCIO也是獨立供電,可以很簡單改裝成其他的不同bank不同電壓要求。
芯片資源GW1N-1的資源有1K的LUT4,並且還有4個18K SRAM快,一個PLL鎖相環。
封裝有最小的CS30的封裝,也有QN32,QN48,LQ100,LQ144這類封裝。灰色線代表是兼容封裝。其實芯片同等封裝都是類似的電源和地,IO管腳有差別。
板子上兩排引腳名稱都已經標記了鎖定管腳的名稱。用戶很容易使用該平臺。
2. 高雲FPGA軟件使用教程
高雲設計軟件在 http://cdn.gowinsemi.com.cn/Gowin_V1.9.1.01Beta_win.rar 直接複製就可以下載,關於license 可以在官網申請就可以,但是必須要有公司名稱和電話號碼。
雙擊桌面的 圖標進入軟件,設定軟件的license。 在help中選擇mange license。
選擇本地license文件。選擇對應文件browse 選擇文件。Save就可以保存設定。這個窗口還可以設定license文件,會跳到官方網站申請。
另外還得設定synplify軟件路徑。在個人用戶變量的LM_LICENSE_FILE設定gowin的 synplify的 編譯軟件的license位置。
建立一個工程,選擇FILE-NEW或者桌面quick start中new project
輸入工程的名字和位置.
選擇芯片類型GW1N系列,Device爲GW1N-1,Package選擇QFN48,SPEED選擇C6/I5.
把blink-led文件複製到工程中src中.
在design中增加文件.
選擇process選項卡
選擇synthesize綜合當前文件.
再雙擊user constraints,選擇floorplanner.
在打開的floorplanner的窗口,可以看到ports名稱,底部有幾個選擇項。
選擇I/O Constraints設定管腳位置,電壓。
Led[0]設定在11,IO Type設定爲lvcmos33,Led[1]設定在9,IO TYPE設定爲LVCMOS33,sys-clk50m在27管腳,IO Type爲LVCMOS33。
選擇保存文件。關閉floorplanner軟件。
在主程序中,選擇design,看到有一個cst文件就是管腳約束文件,設定IO和電壓要求。
再次選擇process,右鍵選擇configuration。配置其中DONE管腳爲普通IO管腳。
在配置窗口選擇,DUAL-PUROSE pin 選擇 USE DONE as regular IO,設定爲普通的IO功能。
雙擊place&route 或者右鍵選擇run。
完成佈局佈線操作以後,選擇program device。
開發板上面下載線纜連接對應的管腳。
插入燒錄器排線。USB電源暫時不插入。
接入5V OUT在5V引腳。
再接入JTAG的TDI,TDO,TCK,TMS以及GND。
選擇scan的按鈕,找到芯片。
選擇operation ,設定爲SRAM Program。Filename選擇impl/pnr/blink-led.fs文件,save保存
選擇箭頭,編程設備。
上述是SRAM燒錄,這個燒錄掉電以後是不會存在的。
由於軟件存在bug問題,所以要關閉一次program軟件,再打開。選擇embedded flash mode,選擇embflash erase,program。選擇save。
再次選擇箭頭,燒錄內部flash。
如果再燒錄其他的模式,記住必要重新打開一次燒錄軟件。
代碼內容。blink_led.v
module blink_led
(
input sys_clk50m,
output[1:0] led
);
// wire sys_clk50m;
// GW_OSC osc_inst ( .oscout(sys_clk50m)) ;
localparam clk500ms = 50_000_000;
reg[31:0] clk_count;
always @(posedge sys_clk50m)
begin
if( clk_count ==clk500ms)
clk_count <=0;
else
clk_count <= clk_count + 1'd1;
end
wire led_temp;
assign led_temp =( clk_count> clk500ms[31:1]) ? 1'b0: 1'b1;
assign led= {led_temp,~led_temp};
//assign led =1'b0;
endmodule