FPGA開發筆記(xilinx 7系列)
本人才疏學淺,孤陋寡聞,下文若有不當之處,還請賜教
一、verilog注意點
- 延時語句
begin
areg = breg;
#10 creg = areg; //在兩條賦值語句間延遲10個時間單位。
end
2.觸發事件
parameter d=50; //宣告d是一個引數 reg [7:0] r; //宣告r是一個8位的暫存器變數 begin //由一系列延遲產生的波形 #d r = 'h35; #d r = 'hE2; #d r = 'h00; #d r = 'hF7; #d -> end_wave; //觸發事件end_wave end
3.並行塊
特點:(1)並行塊中所有語句同時執行
(2)塊內每條語句的執行時間是相對於程式流程進入到塊內的模擬時間的
(3)延時時間是用來給賦值語句ti'g提供執行時序的
(4)當按時間時序排序在最後的語句執行完或者執行disable語句時,程式流程跳出程式塊
並行塊的格式如下: fork 語句1; 語句2; ....... 語句n; join 或 fork:塊名 塊內宣告語句 //塊內宣告語句可以是引數說明語句、 reg型變數宣告語句、 integer型變數宣告語句、 //real型變數宣告語句、time型變數宣告語句、事件(event)說明語句。 語句1; 語句2; ...... 語句n; join
4.時間尺度 `timescale
`timescale 用來說明跟在該命令後的模組的時間單位和時間精度。使用該命令可以在同一個設計裡包含採用了不同的時間單位的模組。
如果在同一個程式設計裡,存在多個`timescale命令,則用最小的時間精度值來決定模擬的時間單位。另外時間精度至少要和時間單位一樣精確,時間精度值不能大於時間單位值。
`timescale 10ns/1ns //模組test的時間單位為10ns、 時間精度為1ns module test; reg set; parameter d=1.55; //根據時間精度,引數d值被從1.55取整為1.6。 initial begin #d set=0; #d set=1; end endmodule
5.verilog語言說明語句
(1)initial說明語句
initial和always說明語句在模擬的一開始即開始執行。initial語句只執行一次。相反, always語句則是不斷地重複執 行,直到模擬過程結束。在一個模組中,使用initial和always語句的次數是不受限制的。
initial
begin
areg=0; //初始化暫存器areg
for(index=0;index<size;index=index+1)
memory[index]=0; //初始化一個memory
end
(2)條件說明語句(if-else/case)
條件說明語句必須放在always和Initial過程塊內部
(3)過程賦值語句:阻塞賦值(=)和非阻塞賦值(<=)(用於對reg型別變數賦值,只在過程塊中使用)
概念:如果後面的賦值語句要等前面的賦值語句完成才執行,成為阻塞;如多條語句同時執行,則稱為非阻塞。
(4)迴圈語句
用於控制執行語句的執行次數,但在FPGA設計中很難被綜合,多用於在模擬程式碼中生成模擬激勵訊號。
6.verilog定義陣列
7.output輸出資料型別
wire [15:0] expendValue;
expand U8_expand(
.clk(clk40),
.rst_n(1),
.data_in(binaryValue),
.data_in_en(frame_addr),
.data_out(expendValue), //output 應為wire型
.data_out_en()
);
.verilog符號代表意義
(1){}大括號
1、{ }表示拼接,{第一位,第二位...};
2、{{ }}表示複製,{4{a}}等同於{a,a,a,a};
所以{13{1‘b1}}就表示將13個1拼接起來,即13'b1111111111111。
(2)$
1、可用作識別符號命名變數,但不能放在首位
2、標識系統任務,在系統任務名稱前加$使之與使用者定義的任務和函式相區分,比如常用的$display,$monitor, $time等
(3)#
1、#(a,b,c.......)表示改變引數型常量(parameter)的值。
2、#10 表示延時10個時間單位。
二、vivado注意點
1、error
2、vivado一個工程檔案裡面不能用兩個micrablaze
三、FPGA晶片特性
1、IO特性
(1)輸入輸出標準:
單端模式:可配置為LVCMOS,LVTTL,HSTL,PCI,SSTL電平標準,例如按鍵輸入,led驅動等;
差分輸入輸出(兩個IO引腳):可以設定為LVDS,Mini_LVDS,RSDS,PPDS,BLVDS,以及差分HSTL和SSTL標準,這 樣可增強FPGA的應用範圍,處理不同型別的訊號。
(2)引腳可分為高效引腳(HP)和寬範圍引腳(HR)
HP:追求高效率,例如訪問高速儲存器和其他晶片間介面,電壓最高1.8V;
HR:滿足寬範圍應用的IO標準,電壓最高3.3V
2、內部儲存器
FPGA的內部儲存器有兩種:BRAM(塊RAM)和DRAM(分佈RAM)。
二者最本質的區別是:BRAM預設輸入有暫存器,所以它在讀、寫使能訊號後的下一個時鐘沿返回資料;而DRAM 就沒有,就是個組合邏輯,讀、寫使能的同一時刻返回資料,即給地址就給資料。從時序的角度上來說,BRAM更好,唯一不足的是它是比較珍貴的硬體資源。
(1)DRAM
是由FPGA邏輯資源查詢表LUT拼起來的。
(2)BRAM
FPGA 的固有硬體資源,主要用於產生較大FIFO或timing要求較高。可配置為同步雙埠RAM和單埠RAM,每個雙埠的36Kbit BRAM
三、FPGA影象處理方法
影象在採集和傳輸的過程中,通常會產生噪聲,使影象質量降低,影響後續處理。因此須對影象進行一些影象濾波、影象增強等預處理。為改善影象質量,去除噪聲通常會對影象進行濾波處理 ,這樣既能去除噪聲,又能保持影象細節。
1、影象增強
兩大方法:空間域方法和時間域方法(以後再詳述)
2、影象濾波
(1)平滑空間濾波器
(2)中值濾波演算法
3、影象邊緣檢測
邊緣指影象區域性強度變化最顯著的部分。邊緣主要存在與目標與目標、目標與背景、區域與區域(不同色彩)之間,邊緣檢測是影象分割、紋理特徵和形狀等影象分析的基礎。
4、影象目標提取演算法
(1)相鄰幀差法
對相鄰的兩幀影象求差,將影象中的目標位置和形狀顯示出來,差分後的影象不為零的即為目標。在兩幀影象中,灰度值沒有變化的部分被剪掉,主要是背景和一些小部分目標。
由檢出的部分大致可以確定運動目標的位置,但是該方法的確定是當物體的位移較小時,難以確定目標的運動方向並且在目標的內部產生空洞。
(2)光流法
(3)背景幀差法
此方法選取一副影象作為背景影象,用採集到的影象與背景影象差分,在背景影象選取合適的時候,能比較準確地分割出目標物體。 速度快,易於實現,並能提供完整的運動區域資訊。
具體原理圖:
如上圖,首先將背景影象和當前影象進行差分,得到兩幅影象的背景差影象(從儲存器中提取出亮度分量得到灰度影象,經過影象的中值濾波等處理後,進入影象檢測演算法模組;然後只需將兩幅影象中對應的畫素相減後再取絕對值即可得到背景差影象),採用直方圖統計的方法來確定影象的 二值化閾值(閾值一般設定為G分量的平均值),最後對影象進行二值化處理,提取出目標的輪廓。
求背景差 VHDL程式碼實現:
5、注意點
(1)視訊輸入裝置的取樣頻率和FPGA的晶振頻率通常不一樣,因此會產生非同步時鐘域的問題,因此可以先將採集的影象資料存入到FIFO中,然後再存進SRAM中。
(2)不同時鐘域之間會產生亞穩態情況:當訊號通過兩個時鐘域的交界處時,將會分別由兩個時鐘來控制訊號的值,此時如果兩時鐘訊號的敏感延非常接近,將出現資料訊號不穩定的情況。