電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>分形生成FPGA設(shè)計(jì)練習(xí)

分形生成FPGA設(shè)計(jì)練習(xí)

2023-07-06 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

Git 倉(cāng)庫(kù)

注意:模糊和偽像是手機(jī)攝像頭偽像,不存在于生成的電子 VGA 信號(hào)中)

分形生成是一種流行的 FPGA 設(shè)計(jì)練習(xí)。例如,斯坦福大學(xué)在 2002 年就已將其用作實(shí)驗(yàn)室作業(yè)。一定是在那個(gè)時(shí)候,我在某個(gè)交易會(huì)上看到了類(lèi)似的演示,并且從那時(shí)起就渴望嘗試一下。

好吧,我最終解決了它。

花了很長(zhǎng)時(shí)間。

動(dòng)機(jī)

FPGA 業(yè)余項(xiàng)目增加了一個(gè)獨(dú)特的設(shè)計(jì)挑戰(zhàn):它需要始終充滿(mǎn)樂(lè)趣。

有時(shí),通往終點(diǎn)線(xiàn)的路變得筆直、明顯且乏味就像徒步旅行與通勤一樣,這不僅僅是以最有效的方式從 A 地到達(dá) B 地……所以你提出了一個(gè)新的想法,讓它再次變得有趣。沖洗并重復(fù)。

概述

“樂(lè)趣因素驅(qū)動(dòng)的需求管理”最終沿著這些路線(xiàn)發(fā)展:

  • 實(shí)時(shí)計(jì)算
  • 60 Hz 時(shí)的全高清分辨率 (1920x1080)
  • 明智地使用 FPGA:最終實(shí)現(xiàn)接近每個(gè)時(shí)鐘周期每個(gè)乘法器一個(gè)操作。USB 總線(xiàn)功率預(yù)算約為 2 瓦的 35 尺寸 Artix 上,這是每秒 180 億次乘法運(yùn)算。
  • 執(zhí)行動(dòng)態(tài)資源分配。分形算法有些不尋常,因?yàn)樗璧牡螖?shù)因點(diǎn)而異。與簡(jiǎn)單地設(shè)置固定的迭代次數(shù)相比,復(fù)雜度大大增加(一個(gè)時(shí)鐘周期內(nèi)可能出現(xiàn)隨機(jī)數(shù)量的結(jié)果,結(jié)果是無(wú)序的)但性能也是如此。
  • 限制為 18 位乘法,因?yàn)樗?Xilinx 6/7 系列 DSP48 塊的原生寬度。為更高分辨率增加內(nèi)部位寬很簡(jiǎn)單,但資源使用量猛增。
  • (合理地)獨(dú)立于供應(yīng)商。我決定使用開(kāi)源“J1B”軟核 CPU,而不是 Microblaze MCS,后者會(huì)非常簡(jiǎn)單。
  • 我決定使用我自己的簡(jiǎn)單編譯器/匯編器“forthytwo.exe”,而不是用于 J1B 的原始“gforth”工具鏈,它在整個(gè)過(guò)程中得到了清理。
  • CPU 上對(duì)性能無(wú)關(guān)緊要的代碼的浮點(diǎn)數(shù)學(xué)運(yùn)算。
    “因?yàn)楫?dāng)你凝視兔子洞時(shí),兔子洞也在凝視你”。
    我自己的“最小”浮點(diǎn)數(shù)實(shí)現(xiàn)并沒(méi)有像 IEEE 754 那樣精致或安全,但它很小并且到目前為止做得很好。
  • 普通 UART 上的 CPU 引導(dǎo)加載程序(意味著沒(méi)有專(zhuān)有的 Xilinx JTAG)。包含的引導(dǎo)加載程序?qū)崿F(xiàn)了強(qiáng)大的同步和高效的二進(jìn)制文件上傳。
  • 沒(méi)有深?yuàn)W的工具,能夠在 Windows 上運(yùn)行(同樣,Linux 會(huì)更容易)。在干凈的 Windows PC 上,可以通過(guò)安裝 MinGW(開(kāi)發(fā)人員設(shè)置)、Vivado 和 Verilator 來(lái)設(shè)置構(gòu)建系統(tǒng)。有關(guān)后者,請(qǐng)參閱我的安裝說(shuō)明。將例如 Teraterm 與引導(dǎo)加載程序一起使用。
  • 包含電池的項(xiàng)目,旨在通過(guò)刪除不需要的內(nèi)容來(lái)重用(也許這更多是在微控制器方面,因?yàn)榉中尾糠质轻槍?duì)特定問(wèn)題的)

就緒/有效的設(shè)計(jì)模式說(shuō)明

計(jì)算引擎在很大程度上依賴(lài)于有效/就緒的握手范例,該范例在整個(gè)鏈中一致使用。

在這里,它非常重要,原因很簡(jiǎn)單:分形發(fā)生器的 200 MHz 時(shí)鐘速率小于 VGA 像素速率的兩倍。任何需要空閑時(shí)鐘周期來(lái)恢復(fù)的“次優(yōu)”握手方案都會(huì)破壞體系結(jié)構(gòu)。

就緒/有效組合路徑問(wèn)題

在典型的處理塊中,數(shù)據(jù)通過(guò)一系列寄存器以鎖步方式移動(dòng)。當(dāng)通過(guò)就緒/有效接口級(jí)聯(lián)任意數(shù)量的此類(lèi)塊時(shí),“就緒”信號(hào)形成從鏈的末端到開(kāi)始的組合路徑。這會(huì)使時(shí)序收斂變得困難或不可能。當(dāng)考慮處理鏈末端發(fā)出“未準(zhǔn)備好”(接受數(shù)據(jù))信號(hào)時(shí)會(huì)發(fā)生什么時(shí),問(wèn)題就很明顯了:整個(gè)管道長(zhǎng)度上的數(shù)據(jù)無(wú)處可去,因此整個(gè)鏈必須在一個(gè)時(shí)鐘周期。

解決方案是使用 FIFO 將鏈分成多個(gè)段(2 個(gè)插槽就足夠了)。有一個(gè)問(wèn)題:我可以設(shè)計(jì)一個(gè)“優(yōu)化的”FIFO,即使數(shù)據(jù)已滿(mǎn),只要在同一時(shí)鐘周期內(nèi)從輸出中取出一個(gè)元素,它也會(huì)接受數(shù)據(jù)。這種“優(yōu)化”將準(zhǔn)確地引入 FIFO 應(yīng)該打破的組合路徑,因此它對(duì)于解耦組合鏈?zhǔn)菬o(wú)用的。換句話(huà)說(shuō),F(xiàn)IFO的輸入端不能組合使用輸出端的“就緒”信號(hào)。

就緒/有效流控

也許這是顯而易見(jiàn)的,但就緒/有效鏈中的數(shù)據(jù)流可以在任何時(shí)候停止,只需插入一個(gè)將有效和就緒信號(hào)都強(qiáng)制為零(未斷言)的塊即可。該塊可以是組合的并且可以取決于觀察到的數(shù)據(jù)值。該模式用于阻止計(jì)算引擎運(yùn)行在監(jiān)視器電子束之前太遠(yuǎn)。

RTL實(shí)現(xiàn)

時(shí)鐘域

共有三個(gè)時(shí)鐘域:

  • 200 MHz 的計(jì)算引擎(大部分設(shè)計(jì))。這可以推得更高,但會(huì)使設(shè)計(jì)更難處理。現(xiàn)在,沒(méi)有理由這樣做,芯片已經(jīng)很熱了。
  • 像素頻率為 148.5 MHz 的 VGA 監(jiān)視器信號(hào)
  • J1B CPU 在 100 MHz,因?yàn)樗年P(guān)鍵路徑對(duì)于 200 MHz 操作來(lái)說(shuō)太慢了。

數(shù)據(jù)流

注:圖中名稱(chēng)對(duì)應(yīng)Verilog實(shí)現(xiàn)

poYBAGOS37KAWrjCAADNRw7ub1Y165.png
?

塊“vga” 100創(chuàng)建 VGA 監(jiān)視器時(shí)序。它的輸出之一是當(dāng)前在電子束下的像素?cái)?shù)。

像素位置經(jīng)由格雷編碼通過(guò)時(shí)鐘域交叉點(diǎn)110進(jìn)入“觸發(fā)”塊120 。這里,當(dāng)像素位置返回到零時(shí),檢測(cè)到新幀的開(kāi)始。這在最后一個(gè)可見(jiàn)像素已被發(fā)送到顯示器之后立即發(fā)生,因此前沿/VSYNC/后沿時(shí)間間隔可用于預(yù)先計(jì)算圖像數(shù)據(jù),直到緩沖器RAM 220的容量。

新幀開(kāi)始的檢測(cè)觸發(fā)以下“pixScanner” 130 。該塊已經(jīng)從 CPU 140接收到分形坐標(biāo)并使用兩對(duì)增量逐行掃描它們:第一對(duì)增量 X/Y 用于電子束向右移動(dòng)(列),第二對(duì)用于向下移動(dòng)(行)。使用適當(dāng)?shù)脑隽?,圖片可以旋轉(zhuǎn)任何角度。

該塊保留一個(gè)幀計(jì)數(shù)器,CPU 140會(huì)對(duì)其進(jìn)行輪詢(xún),以在先前的幀坐標(biāo)已存儲(chǔ)后立即開(kāi)始計(jì)算下一幀坐標(biāo)。

生成的像素坐標(biāo)向前移動(dòng)到FIFO 150 。這只是為了解耦組合接受/就緒路徑。它不會(huì)提高吞吐量,因?yàn)橄袼貟呙鑳x已經(jīng)能夠在每個(gè)時(shí)鐘周期生成一個(gè)輸出。

“像素坐標(biāo)”由分形空間中的 X 和 Y 位置以及線(xiàn)性像素位置形成,相當(dāng)于它在 vga 塊100中的對(duì)應(yīng)位置。后者是必需的,因?yàn)榻Y(jié)果需要重新排序。

像素坐標(biāo)現(xiàn)在移動(dòng)到循環(huán)分配隊(duì)列160中。其目的是為并行“julia”(分形)計(jì)算引擎180提供像素坐標(biāo)。如果一個(gè)計(jì)算引擎準(zhǔn)備好接受一項(xiàng)新工作,該值將從隊(duì)列中刪除,否則它將右移通過(guò)插槽170并最終循環(huán)回到隊(duì)列的頭部。

當(dāng)沒(méi)有數(shù)據(jù)循環(huán)時(shí),隊(duì)列160將只接受來(lái)自 FIFO_K 150的新輸入。ready/valid 協(xié)議的使用使得此功能的實(shí)現(xiàn)相對(duì)簡(jiǎn)單。

計(jì)算引擎180將迭代 Mandelbrot 集算法(“轉(zhuǎn)義時(shí)間”算法,參見(jiàn)維基百科:https://en.wikipedia.org/wiki/Mandelbrot_set)。

使用默認(rèn)設(shè)置(很容易更改),實(shí)現(xiàn)使用 30 個(gè)“julia”引擎180 。它們中的每一個(gè)都由 12 個(gè)管道級(jí)別組成。換句話(huà)說(shuō),每個(gè)引擎一次處理多達(dá) 12 個(gè)獨(dú)立的計(jì)算。每個(gè)“julia”引擎執(zhí)行三個(gè)并行乘法(xx、yy、xy),總共使用 90 個(gè)乘法器,每個(gè)周期在滿(mǎn)負(fù)載下執(zhí)行一次運(yùn)算。

由于下游 RAM 220中的緩沖空間相當(dāng)有限——遠(yuǎn)小于全幀——必須防止計(jì)算引擎180在電子束位置之前運(yùn)行太遠(yuǎn)。因此,流量控制機(jī)制190內(nèi)置于計(jì)算引擎中。它根據(jù)電子束檢查每個(gè)條目的像素編號(hào),如果它會(huì)導(dǎo)致 RAM 220中的循環(huán)溢出,則阻止它離開(kāi)計(jì)算引擎180 如果拒絕退出,該值將繼續(xù)通過(guò)計(jì)算引擎進(jìn)行虛擬迭代。時(shí)鐘域穿越110相對(duì)于實(shí)際圖像生成將像素位置延遲幾個(gè)時(shí)鐘周期,因此流量控制將始終(保守地)滯后于幾個(gè)像素。

類(lèi)似于循環(huán)分發(fā)隊(duì)列160 ,結(jié)果被收集到循環(huán)收集隊(duì)列190中。如果槽200為空,它將接受來(lái)自計(jì)算引擎180的結(jié)果,否則計(jì)算引擎將繼續(xù)對(duì)結(jié)果進(jìn)行虛擬迭代。

來(lái)自收集隊(duì)列190的退出數(shù)據(jù)項(xiàng)移動(dòng)到FIFO_E 210 ,然后移動(dòng)到雙端口存儲(chǔ)器220 。這個(gè) FIFO 不再是絕對(duì)必要的:因?yàn)殡p端口 ram 220總是準(zhǔn)備好接受數(shù)據(jù),它可以用更便宜的寄存器代替。

雙端口存儲(chǔ)器220在其第二端口上由來(lái)自“vga”塊100的電子束位置索引。dp-memory 實(shí)現(xiàn)數(shù)據(jù)到 VGA 像素時(shí)鐘域的交叉。RAM 的輸出連同 HSYNC 和 VSYNC 信號(hào)一起最終轉(zhuǎn)發(fā)到監(jiān)視器輸出。

雖然圖中未顯示,但可通過(guò)連接到 CPU 的 IO 端口的寄存器訪(fǎng)問(wèn)按鈕和 LED。

“julia”計(jì)算引擎

文檔待續(xù)……請(qǐng)暫時(shí)參考代碼(“julia”模塊)。

運(yùn)行演示

  • 獲取 CMOD A7-35 板(或修改項(xiàng)目)。該設(shè)計(jì)對(duì)于 15 尺寸的變體來(lái)說(shuō)太大了。
  • 上傳預(yù)構(gòu)建的“最終”比特流
  • CPU 運(yùn)行時(shí),這兩個(gè)按鈕將分別切換紅色和綠色 LED。
  • 使用跨接電纜將顯示器連接到 DIL48 插座

默認(rèn)引出線(xiàn)

  • 引腳 1:紅色(照片中的紅線(xiàn))
  • 引腳 2:綠色(照片中的綠線(xiàn))
  • 引腳 3:藍(lán)色(照片中的藍(lán)線(xiàn))
  • 引腳 4:HSYNC(照片中的黃線(xiàn))
  • 引腳 5:VSYNC(照片中的橙色線(xiàn))
  • pin 25 or PMOD header: common GND (照片中的黑線(xiàn))

請(qǐng)注意:3.3 V 不符合 VGA 模擬信號(hào)的規(guī)格。我從來(lái)沒(méi)有遇到過(guò)在相當(dāng)多的顯示器/投影儀上直接接線(xiàn)的問(wèn)題,但請(qǐng)務(wù)必使用常識(shí)。

pYYBAGOS39CATejeAARbo3w7NuQ763.png
跳線(xiàn)連接到現(xiàn)成的 SUB-D 監(jiān)視器電纜
?

?

pYYBAGOS3_iAF5k3AAdAtkNQEpw054.png
跳線(xiàn)布線(xiàn)(不同視圖)
?

?

pYYBAGOS4CCAay3AAAfcvgbJARQ452.png
跳線(xiàn)布線(xiàn),F(xiàn)PGA端
?

。

構(gòu)建項(xiàng)目

請(qǐng)使用 Vivado 2019.2。免費(fèi)的“網(wǎng)絡(luò)版”就足夠了。

要重建比特流,請(qǐng)從頂級(jí)目錄運(yùn)行

  • make forthytwo:構(gòu)建編譯器

然后...

...對(duì)于“引導(dǎo)加載程序”版本(如果您想編輯微控制器代碼)

  • 制作分形(仍然來(lái)自頂級(jí)目錄)。這將創(chuàng)建包含 J1B rom 內(nèi)容的 main.v 文件
  • 在 fractalsProject/CMODA7_fractalDemo 中打開(kāi) Vivado 工程
  • 生成比特流
  • 上傳比特流
  • 將 teraterm 連接到串行端口。測(cè)試按鍵是否回顯“x”=> 引導(dǎo)加載程序正常運(yùn)行
  • 通過(guò) Teraterm 的“發(fā)送文件”功能以二進(jìn)制模式發(fā)送“fractalsProject/out/main.bootBin”(!!)。請(qǐng)注意,“main.bootBin”是在啟用或禁用引導(dǎo)加載程序的情況下編譯的并不重要。
  • 正確上傳打印一個(gè)字母“1”,按鈕將點(diǎn)亮 LED。只有現(xiàn)在 VGA 信號(hào)存在

...對(duì)于“發(fā)布”版本(在 FPGA 比特流中帶有微控制器代碼)

  • 根據(jù)第一行中的說(shuō)明編輯 bootloader/bootloader.txt(注釋掉第一個(gè) BRA: 并取消注釋第二個(gè) BRA:)
  • 從頂層:制作分形
  • 從 Vivado 構(gòu)建比特流
  • 程序比特流(或?qū)懭腴W存)。一旦黃色“prog ready”LED 亮起,紅色/綠色 LED 應(yīng)響應(yīng)按鈕按下并且 VGA 信號(hào)存在。

Git 倉(cāng)庫(kù)

  • 在這里(用于在線(xiàn)閱讀。請(qǐng)克隆頂級(jí)“forthytwo”repo 并從頂級(jí)使用“make”。

執(zhí)照

請(qǐng)注意,J1B CPU 仍保留其原始 BSD 3-clause 許可,而我自己的文件是根據(jù) MIT 許可發(fā)布的。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)