一、 流水線設(shè)計(jì)
將原本一個(gè)時(shí)鐘周期完成的較大的組合邏輯通過合理的切割后分由多個(gè)時(shí)鐘周期完成。該部分邏輯運(yùn)行的時(shí)鐘頻率會(huì)有明顯對(duì)的提升,提高系統(tǒng)的性能用面積換速度
一個(gè)流水線設(shè)計(jì)需要4個(gè)步驟完成一個(gè)數(shù)據(jù)的處理過程,那么從有數(shù)據(jù)輸入的第一個(gè)時(shí)鐘周期開始,直到第4個(gè)時(shí)鐘周期處理完第一個(gè)數(shù)據(jù),但在以后的每一個(gè)時(shí)鐘周期都會(huì)有處理完成的數(shù)據(jù)輸出,流水線設(shè)計(jì)在開始處理時(shí)需要一定的處理時(shí)間,但以后就會(huì)不斷的輸出數(shù)據(jù),從而大大提高處理速度。(面積換速度)如果不采用流水線設(shè)計(jì),那么處理一個(gè)數(shù)據(jù)就需要4個(gè)時(shí)鐘周期,而采用流水線設(shè)計(jì)則能夠提高將近4倍的處理速度,用一個(gè)復(fù)雜的算術(shù)式子舉例,這是官方給的RGB888 to YCbCr的算法公式,我們可以直接把算法移植到FPGA上,但是我們都知道FPGA無(wú)法進(jìn)行浮點(diǎn)運(yùn)算,所以我們采取將整個(gè)式子右端先都擴(kuò)大256倍,然后再右移8位,這樣就得到了FPGA擅長(zhǎng)的乘法運(yùn)算和加法運(yùn)算了。
這個(gè)計(jì)算式子看起來(lái)是十分簡(jiǎn)單的,但是要是直接用Verilog直接寫出來(lái),那么只能說(shuō),這個(gè)人的代碼寫的一塌糊涂,所以這里就引出FPGA中流水線的設(shè)計(jì)思想。在這里我們選擇加3級(jí)流水線,就第一個(gè)Y分量而言,先計(jì)算括號(hào)中得乘法運(yùn)算,消耗一個(gè)時(shí)鐘,然后將括號(hào)中的數(shù)據(jù)求和,消耗一個(gè)時(shí)鐘,這里為了計(jì)算方便,將128也擴(kuò)大256倍,放到括號(hào)中,最終結(jié)果除以256就行了也就是右移8位,在FPGA中我們只需要舍棄低8位取高8位就行。具體代碼如下
流水線
RGB轉(zhuǎn)YCbCr算法的仿真過程,從圖中可以看出,加了流水線后的運(yùn)算過程,每一級(jí)運(yùn)算相差一個(gè)時(shí)鐘,然而每一級(jí)都在進(jìn)行新的運(yùn)算,我們加了3級(jí)流水線,這樣運(yùn)算速度可以提升3倍。
二、 跨時(shí)鐘域處理
有三種方法
打兩拍
異步雙口RAM
格雷碼轉(zhuǎn)換
1. 打兩拍方法
在進(jìn)行uart串口通信的學(xué)習(xí)的過程中,遇到一個(gè)不理解的問題,在接收模塊中,小梅哥采取的設(shè)計(jì)方式是接收進(jìn)行一步同步化處理,那么為什么要進(jìn)行同步化處理呢?串口通信的設(shè)計(jì),接收的波特率一般是發(fā)送波特率的16倍,單bit傳輸,我的理解是,在發(fā)