網(wǎng)上有很多關(guān)于pos機(jī)開機(jī)一直初始化,如何初始化應(yīng)用表單位置的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)開機(jī)一直初始化的問題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機(jī)開機(jī)一直初始化
FPGA調(diào)試本身就是挺辛苦的一件事情,尤其是在剛開始調(diào)試FPGA的時(shí)候,無(wú)論培訓(xùn)的時(shí)候如何強(qiáng)調(diào)一些注意事項(xiàng),如跨時(shí)鐘域問題,如接口問題,以及RAM讀寫沖突問題,但一旦做起項(xiàng)目來(lái),每每還是有同學(xué)必須要親自往這些坑里面跳一次才真正懂得這些BUG的含義。如雙口RAM在功能仿真時(shí)沒有出現(xiàn)問題,但上板調(diào)試過程中運(yùn)行很久才偶爾出現(xiàn)一次BUG,這時(shí)就需要花費(fèi)大量的時(shí)間去追溯問題的源頭,最后花一周甚至更長(zhǎng)的時(shí)間才能找到是雙口RAM讀寫沖突的問題,時(shí)間早早的就浪費(fèi)掉了。事實(shí)上,上面說跨時(shí)鐘域或者雙口RAM讀寫沖突的這些問題是可以通過時(shí)序仿真仿真出來(lái)的。
FPGA驗(yàn)證在芯片設(shè)計(jì)流程中具有重要的作用,有時(shí)候?yàn)榱苏业侥承〣UG,不得不對(duì)FPGA綜合出來(lái)的網(wǎng)表進(jìn)行后仿真。后仿真又叫時(shí)序仿真,跟課程前面介紹的對(duì)寫出來(lái)的Verilog hdl設(shè)計(jì)代碼和testbench代碼建工程進(jìn)行的功能仿真不同,時(shí)序仿真是把綜合出來(lái)電路中的時(shí)延信息加入到仿真的過程中,模擬出跟更接近于在FPGA上真實(shí)運(yùn)行的情況。本文以Quartus II軟件為例進(jìn)行介紹后仿真的步驟和流程。ISE或VIVADO流程類似或關(guān)聯(lián)ModelSim后更自動(dòng)化。
什么是功能仿真?什么是時(shí)序仿真仿真過程是正確實(shí)現(xiàn)設(shè)計(jì)的關(guān)鍵環(huán)節(jié),用來(lái)驗(yàn)證設(shè)計(jì)者的設(shè)計(jì)思想是否正確,及在設(shè)計(jì)實(shí)現(xiàn)過程中各種分布參數(shù)引入后,其設(shè)計(jì)的功能是否依然正確無(wú)誤。仿真主要分為功能仿真和時(shí)序仿真。功能仿真是在設(shè)計(jì)輸入后進(jìn)行; 時(shí)序仿真是在邏輯綜合后或布局布線后進(jìn)行。
1. 功能仿真 ( 前仿真 )
功能仿真是指在一個(gè)設(shè)計(jì)中, 在設(shè)計(jì)實(shí)現(xiàn)前對(duì)所創(chuàng)建的邏輯進(jìn)行的驗(yàn)證其功能是否正確的過程。 布局布線以前的仿真都稱作功能仿真, 它包括綜合前仿真( Pre-Synthesis Simulation )和綜合后仿真( Post-Synthesis Simulation )。 綜合前仿真主要針對(duì)原理框圖的設(shè)計(jì) ; 綜合后仿真既適合原理圖設(shè)計(jì) , 也適合基于 HDL 語(yǔ)言的設(shè)計(jì)。
2. 時(shí)序仿真(后仿真)
時(shí)序仿真使用布局布線后器件給出的模塊和連線的延時(shí)信息, 在最壞的情況下對(duì)電路的行為作出實(shí)際地估價(jià)。 時(shí)序仿真使用的仿真器和功能仿真使用的仿真器是相同的, 所需的流程和激勵(lì)也是相同的; 惟一的差別是為時(shí)序仿真加載到仿真器的設(shè)計(jì)包括基于實(shí)際布局布線設(shè)計(jì)的最壞情況的布局布線延時(shí), 并且在仿真結(jié)果波形圖中,時(shí)序仿真后的信號(hào)加載了時(shí)延, 而功能仿真沒有。
一、用Quartus II建立工程。具體過程可參考如下鏈接:
https://jingyan.baidu.com/article/cbcede07ef59cf02f40b4ddb.html。建立工程后的文件如下圖所示。我們以一個(gè)簡(jiǎn)單的8位計(jì)數(shù)器為例進(jìn)行說明。
建立工程的過程中可以配置好綜合之后要產(chǎn)生用來(lái)做后仿真的網(wǎng)表文件,如果沒有提前配置,也可以建好工程后再配置,具體如下圖,點(diǎn)擊右鍵,選擇settings.
settings打開后出來(lái)如下窗口,在左側(cè)選擇Simulation,在右側(cè)EDA Netlist Writer settings里面選擇門級(jí)網(wǎng)表產(chǎn)生的語(yǔ)言以及路徑,之后確定即可。
如下圖,點(diǎn)擊編譯按鈕,開始進(jìn)行綜合。
綜合后的界面如下。
找到剛設(shè)置的網(wǎng)表文件的輸出目錄,在該目錄下要選擇兩個(gè)文件,一個(gè)是.vo的網(wǎng)表文件,另一個(gè)是.sdo的時(shí)延信息文件。
打開.vo的文件可以看到里面有如下圖的三行,就是把時(shí)延信息文件.sdo反標(biāo)到網(wǎng)表文件中。沒有這一句或者時(shí)延信息反標(biāo)不成功,是做不成后仿真的。
把上述過程中產(chǎn)生的.vo和.sdo文件拷貝到要做后仿真的工程文件夾下建立仿真工程,除了測(cè)試文件采用前仿真的測(cè)試文件外,還要添加一些Quartus的庫(kù)文件,主要有三個(gè),220model.v,altera_mf.v和cyclone_atoms(這個(gè)文件需要根據(jù)進(jìn)行綜合時(shí)選擇的FPGA的型號(hào)來(lái)定)。注意,此工程是不能添加原始設(shè)計(jì)代碼的,而是用綜合后的網(wǎng)表文件替代。建立工程后的截圖如下。
時(shí)序仿真的工程
功能仿真的工程
從上面兩圖可以明顯對(duì)比出,功能仿真和時(shí)序仿真工程中的代碼僅有count.v(功能仿真)和count.vo(時(shí)序仿真)不同,其余都完全一樣。
編譯成功后開始仿真。
右鍵點(diǎn)擊下圖中tb_count選擇信號(hào)到波形文件的窗口。
運(yùn)行后的結(jié)果截圖,可以看出計(jì)數(shù)器是按照時(shí)鐘的上升沿在自加1跳變的。
選擇局部,計(jì)數(shù)數(shù)據(jù)由7跳變到8的時(shí)刻進(jìn)行放大,可以看到,7狀態(tài)后不是立即跳變到8的,而是經(jīng)過了很多個(gè)中間狀態(tài)。同時(shí)開始跳變的時(shí)刻也不是時(shí)鐘的上升沿到來(lái)后立即跳變的,而是延遲了一段時(shí)間才開始的。
再進(jìn)行放大,可以看到7變?yōu)?中間還經(jīng)歷了11和9兩個(gè)中間狀態(tài),同時(shí)觀察下面每Bit信號(hào)的跳變,可以發(fā)現(xiàn)每1位信號(hào)的跳變時(shí)刻也是不同的,這是因?yàn)樵贔PGA內(nèi)部,總線型信號(hào)布局布線后每bit的走的路徑是不同的,連線引入的時(shí)延也是不同的,這也進(jìn)一步證明了后仿真的時(shí)延信息是成功的反標(biāo)到了網(wǎng)表文件中了。同時(shí),這種總線型信號(hào)跳變有很多中間狀態(tài)的特點(diǎn),也是區(qū)別于前仿真或者叫功能仿真的一種最直接的標(biāo)記。
我們回過頭來(lái)對(duì)比一下功能仿真的波形,如下圖,很明顯的看出來(lái)在計(jì)數(shù)跳變的過程中,沒有任何中間狀態(tài)的改變。
動(dòng)圖介紹ModelSim建工程到仿真使用Modelsim建立仿真環(huán)境進(jìn)行仿真的操作步驟動(dòng)圖如下:
補(bǔ)充知識(shí)--前仿真和后仿真的概念功能仿真和時(shí)序仿真常常又分別被叫做前仿真和后仿真。
前仿真和后仿真的區(qū)別:前仿真就是指綜合前的仿真,也就是行為級(jí)的仿真,如你在Modelsim直接寫代碼的仿真。后仿真指的是綜合后的仿真,也就是功能仿真。比如你在Modelsim中用VHDL寫了個(gè)計(jì)數(shù)器,行為級(jí)得仿真通過了,你把它加到quartus中或者其他的綜合工具進(jìn)行綜合,綜合完后生成功能網(wǎng)表,它把行為語(yǔ)言變成寄存器傳送級(jí)語(yǔ)言,這時(shí)候你把它加到Modelsim中仿真叫后仿真,后仿真成功后,你還要在quartus中進(jìn)行映射,布局布線,完后進(jìn)行時(shí)序分析,生成時(shí)序網(wǎng)表,描述器件里門或者布線的延時(shí),最后把延時(shí)網(wǎng)表和功能網(wǎng)表一起加到Modelsim中仿真叫門級(jí)仿真。
門級(jí)仿真和時(shí)序仿真的區(qū)別:門級(jí)仿真是quartus生成的網(wǎng)表文件.vo。門級(jí)則不考慮互聯(lián)延遲,二只考慮了器件的延遲。時(shí)序仿真是選擇具體器件并布局布線后進(jìn)行的包含定時(shí)關(guān)系的仿真,主要驗(yàn)證是否滿足時(shí)間約束關(guān)系、延時(shí)、最大工作頻率和消耗的資源等。時(shí)序仿真是需添加時(shí)延文件.sdo。
modelsim 是專門進(jìn)行仿真的軟件,可以分別進(jìn)行前仿真和后仿真。前仿真也稱為功能仿真,主旨在于驗(yàn)證電路的功能是否符合設(shè)計(jì)要求,其特點(diǎn)是不考慮電路門延遲與線延遲,主要是驗(yàn)證電路與理想情況是否一致??删C合FPGA代碼是用RTL級(jí)代碼語(yǔ)言描述的,其輸入為RTL級(jí)代碼與testbench。后仿真也稱為時(shí)序仿真或者布局布線后仿真,是指電路已經(jīng)映射到特定的工藝環(huán)境以后,綜合考慮電路的路徑延遲與門延遲的影響,驗(yàn)證電路能否在一定時(shí)序條件下滿足設(shè)計(jì)構(gòu)想的過程,是否存在時(shí)序違規(guī)。其輸入文件為從布局布線結(jié)果抽象出來(lái)的門級(jí)網(wǎng)表、testbench和擴(kuò)展為sdo或sdf的標(biāo)準(zhǔn)時(shí)延文件。sdo、sdf的標(biāo)準(zhǔn)時(shí)延文件不僅包含門延遲,還包括實(shí)際布線延遲,能較好地反映芯片的實(shí)際工作情況。一般來(lái)說后仿真是必選的,檢查設(shè)計(jì)時(shí)序與實(shí)際的FPGA運(yùn)行情況是否一致,確保設(shè)計(jì)的可靠性和穩(wěn)定性。
在進(jìn)行網(wǎng)表仿真時(shí),經(jīng)常會(huì)遇到一些不定態(tài)問題(紅線的說法稍顯不專業(yè)),通常一個(gè)模塊中某個(gè)寄存器出現(xiàn)X狀態(tài),就會(huì)造成整個(gè)仿真都出現(xiàn)X狀態(tài),仿真無(wú)法進(jìn)行。這時(shí)我們需要找出最先出現(xiàn)X態(tài)的邏輯,找出錯(cuò)誤的原因并消除后才能重新進(jìn)行仿真。
a. 首先應(yīng)該查看是否所有的RAM都進(jìn)行了初始化操作。雖然很多RAM在實(shí)現(xiàn)功能時(shí)并不需要初始化,但后仿時(shí)沒有初始化的RAM讀出X態(tài),X會(huì)蔓延出去,造成整個(gè)系統(tǒng)都出現(xiàn)X態(tài)??刹捎胿erilog中系統(tǒng)任務(wù)readmemh對(duì)RAM進(jìn)行初始化操作。
b. 異步時(shí)鐘域信號(hào)賦值很可能會(huì)導(dǎo)致后仿出現(xiàn)紅線,但這并不能說明系統(tǒng)錯(cuò)誤,通常我們讓仿真平臺(tái)不去檢查異步時(shí)鐘域賦值導(dǎo)致的時(shí)序違例,從而消除這部分紅線。
c. DUT與外部testbench模型接口時(shí)序不匹配導(dǎo)致,系統(tǒng)采進(jìn)來(lái)數(shù)據(jù)錯(cuò)誤導(dǎo)致紅線。比如以太網(wǎng)的GMII接口,最開始建立ephy模型時(shí)是在RTL仿真環(huán)境下描述的,在Rx_clk上升沿發(fā)出Rxd數(shù)據(jù);但在做后仿真時(shí)由于時(shí)延等的影響,按上升沿進(jìn)來(lái)的數(shù)據(jù)就會(huì)出現(xiàn)時(shí)序違例。這時(shí)就需要我們修改ephy模型,讓數(shù)據(jù)Rxd在上升沿后延遲一段時(shí)間再送出,使GMII接口滿足時(shí)序要求。
d. 組合邏輯路徑過長(zhǎng)導(dǎo)致的時(shí)序?yàn)槔H缦聢D所示是讀取RAM的時(shí)序波形,讀地址ADR,讀使能ME,時(shí)鐘CLK,當(dāng)時(shí)鐘上升沿到來(lái)時(shí),應(yīng)該讀取ADR為0x40地址的數(shù)據(jù),但是由于兩個(gè)寄存器之間的組合邏輯時(shí)延很大,在讀RAM的上升沿到來(lái)時(shí)RAM地址沒有保持穩(wěn)定,出現(xiàn)時(shí)序?yàn)槔?,?dǎo)致輸出數(shù)據(jù)線是X態(tài)。如果是在代碼設(shè)計(jì)時(shí),我們應(yīng)該盡量避免這種情況的發(fā)生,減小組合邏輯的復(fù)雜度以減小時(shí)延。
后仿中時(shí)序問題
加快后仿真的方法在做后仿時(shí),跑1ms的數(shù)據(jù)通常是前仿的幾十倍,甚至幾百倍,所以如果要把前仿的所有測(cè)試?yán)寂芡晖ǔ滋鞄滓挂膊灰欢茏咄晁辛鞒蹋曳抡孢^程中還可能經(jīng)常遇到一些問題,阻止仿真進(jìn)行下去。如果能夠加快仿真的速度,將會(huì)大大提高我們的工作效率。
a. 通常測(cè)試過程中,我們會(huì)把互相不影響的測(cè)試?yán)珠_運(yùn)行,這樣既可以同時(shí)運(yùn)行多個(gè)測(cè)試?yán)挚梢栽谀骋粋€(gè)測(cè)試?yán)l(fā)生錯(cuò)誤時(shí),減少重新測(cè)試需要的時(shí)間。
b. 在運(yùn)行某一個(gè)測(cè)試?yán)龝r(shí),如果這個(gè)測(cè)試?yán)枰\(yùn)行的模塊可以完全獨(dú)立于其它模塊,那么我們就可以利用force語(yǔ)句將其它模塊的時(shí)鐘強(qiáng)制拉低,這樣其它模塊就不會(huì)運(yùn)行。例如在測(cè)試CPU的外設(shè)時(shí),并不會(huì)對(duì)設(shè)計(jì)模塊部分進(jìn)行任何操作,如果把設(shè)計(jì)模塊的時(shí)鐘拉低,會(huì)大大縮短外設(shè)測(cè)試的時(shí)間。但在做后仿時(shí)force語(yǔ)句應(yīng)慎用,如果把設(shè)計(jì)模塊里的時(shí)鐘拉低,跟這一模塊相連的時(shí)鐘信號(hào)也可能被拉低,造成需要測(cè)試的部分無(wú)法運(yùn)行,只有把測(cè)試部分模塊的時(shí)鐘重新釋放(release)掉才能正常運(yùn)行。
c. 有些需要CPU初始化的RAM,如流控、隊(duì)列門限等RAM,在CPU寫RAM的過程需要大量的時(shí)間,如果RAM讀寫測(cè)試已經(jīng)通過,沒有必要再通過CPU寫RAM,可以利用上面RAM初始化文件的方法,把需要配置的值寫進(jìn)RAM中,可以大大縮短運(yùn)行時(shí)間。
雙口RAM的讀寫沖突問題在FPGA調(diào)試中經(jīng)常遇到,并且,往往是那種費(fèi)了好大勁追信號(hào)追到吐血后才確認(rèn)到的問題。在初學(xué)FPGA調(diào)試中,常常為了所謂的省事,在寫代碼設(shè)計(jì)仿真階段就忽略了雙口RAM的讀寫沖突問題(讀和寫對(duì)同一個(gè)地址同時(shí)進(jìn)行操作,功能仿真時(shí)可能沒有出現(xiàn),但因?yàn)橛袝r(shí)延的原因,在時(shí)序仿真時(shí)就出現(xiàn)了),導(dǎo)致在FPGA上板調(diào)試中浪費(fèi)大量的時(shí)間。在進(jìn)行FPGA工程上板調(diào)試前,如果能夠進(jìn)行雙口RAM的后仿真,就可以避免后期無(wú)窮盡的追信號(hào)最后定位到雙口RAM讀寫沖突上了。希望能夠給大家提個(gè)醒,內(nèi)容雖然簡(jiǎn)單,但的確是不容忽視的一個(gè)隱藏很深的大問題。
FPGA 內(nèi)部塊RAM 的讀時(shí)序如下圖:
可知,塊RAM的讀延時(shí)為兩個(gè)時(shí)鐘周期。
FPGA 內(nèi)部塊RAM 的寫時(shí)序如下圖:
可知,塊RAM 的寫延時(shí)為0,但是RAM 中的內(nèi)容是在寫的下一個(gè)時(shí)鐘改變。
在進(jìn)行代碼設(shè)計(jì)時(shí)應(yīng)該盡量避免對(duì)一塊RAM的同一個(gè)地址同時(shí)進(jìn)行讀寫操作,防止讀寫沖突時(shí)讀出數(shù)據(jù)是X態(tài)。
對(duì)于單端口RAM不能對(duì)同一RAM進(jìn)行讀寫,對(duì)于雙端口RAM可以從兩個(gè)端口對(duì)同一地址進(jìn)行讀操作,但不能同時(shí)進(jìn)行寫操作也不能同時(shí)進(jìn)行讀寫操作。
? 問題:
隊(duì)列長(zhǎng)度信息RAM a b口讀寫異常,更新出錯(cuò)。
? 現(xiàn)象:
端口卡死,某隊(duì)列長(zhǎng)度達(dá)到最大門限,但是發(fā)送調(diào)度顯示隊(duì)列為空,新數(shù)據(jù)幀入隊(duì)申請(qǐng),不滿足門限要求而丟棄,輸出沒有調(diào)度結(jié)果,也不能出隊(duì)操作;
? 分析定位:
根據(jù)現(xiàn)象中停止發(fā)送,對(duì)隊(duì)列長(zhǎng)度信息更新相關(guān)信號(hào)進(jìn)行Debug測(cè)試,定位出問題的根源位置如圖a所示,該隊(duì)里進(jìn)行入隊(duì)操作后,隊(duì)列長(zhǎng)度信息被入隊(duì)調(diào)度通過隊(duì)列信息RAM a口更新寫入長(zhǎng)度13,此時(shí)出隊(duì)操作正在執(zhí)行,在獲取隊(duì)列長(zhǎng)度信時(shí),在a口剛寫入后的一個(gè)clk,讀取得到隊(duì)列長(zhǎng)度信息為12,再經(jīng)過1個(gè)clk,數(shù)據(jù)穩(wěn)定在13;但是異常數(shù)據(jù)12被出隊(duì)操作獲取到并用于出隊(duì)號(hào)隊(duì)列長(zhǎng)度的更新,隊(duì)列長(zhǎng)度更新出錯(cuò),若干次操作后,當(dāng)最后一幀出隊(duì)完成后,會(huì)將隊(duì)列長(zhǎng)度更新為負(fù)數(shù),如圖b所示,F(xiàn)PGA中不操作負(fù)數(shù),即二進(jìn)制中很大的正數(shù),遠(yuǎn)大于隊(duì)列最大門限,后面再進(jìn)行入隊(duì)操作時(shí),入隊(duì)操作不滿足門限要求,無(wú)法入隊(duì)操作,同時(shí)出隊(duì)操作認(rèn)為隊(duì)列為空,不會(huì)調(diào)度該隊(duì)列出隊(duì)操作,進(jìn)入卡死狀態(tài);隊(duì)列長(zhǎng)度13的二進(jìn)制表示為1101’b,12的二進(jìn)制表示為1100’b,說明出現(xiàn)了單bit翻轉(zhuǎn)錯(cuò)誤的問題。
圖a 雙口RAM a b口讀寫異常
圖b 隊(duì)列長(zhǎng)度信息更新出現(xiàn)負(fù)數(shù)
? 解決方法:
首先考慮對(duì)RAM輸出加寄存操作,但是這樣會(huì)整體引入操作時(shí)延,即使入隊(duì)和出隊(duì)操作不是同一隊(duì)列,每次在RAM讀數(shù)據(jù)情況下都需要多等一個(gè)clk,為了解決該問題,采用的方法是在出隊(duì)操作需要讀隊(duì)列長(zhǎng)度時(shí),如果前一個(gè)時(shí)刻a口剛更新該隊(duì)列,此時(shí)a口晚一個(gè)clk再用數(shù)據(jù),保證第二個(gè)clk讀出的數(shù)據(jù)是a口寫入穩(wěn)定輸出的,其他情況下不引入時(shí)延。
源碼1、tb_count.v
`timescale 1ns/100ps
module tb_count;
reg clk;
reg reset;
reg d;
wire [7:0] q;
initial
begin
clk=1\'b0;
reset = 1\'b0;
d = 1\'b0;
#10 reset = 1\'b1;
#1 d = 1\'b1;
#10 reset = 1\'b0;
#34 d = 1\'b0;
#1000 $stop;
end
always #10
clk = ~clk;
counter u_counter(
.clk(clk),
.reset(reset),
.d(d),
.q(q)
);
endmodule
2、counter.v
`timescale 1ns/100ps
module counter(
clk,
reset,
d,
q );
input clk;
input d;
input reset;
output [7:0] q;
reg [7:0] q;
reg [7:0] q_ff1;
reg [7:0] q_ff2;
reg d_ff1;
reg d_ff2;
wire d_pos;
wire d_neg;
always @(posedge clk or posedge reset)
begin
if(reset == 1\'b1)
d_ff1<= 1\'b0;
else
d_ff1<=#1 d;
end
always @(posedge clk or posedge reset)
begin
if(reset == 1\'b1)
d_ff2<= 1\'b0;
else
d_ff2<=#1 d_ff1;
end
assign d_pos = d & (~d_ff1);
assign d_neg = ~d & d_ff1;
always @(posedge clk or posedge reset)
begin
if(reset == 1\'b1)
q<= 8\'b0;
else
q<= q + 1\'b1;
end
always @(posedge clk or posedge reset)
begin
if(reset == 1\'b1)
q_ff1<= 8\'b0;
else
q_ff1<= q ;
end
always @(posedge clk or posedge reset)
begin
if(reset == 1\'b1)
q_ff2<= 8\'b0;
else
q_ff2<= q_ff1 ;
end
endmodule
全文完。
以上就是關(guān)于pos機(jī)開機(jī)一直初始化,如何初始化應(yīng)用表單位置的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)開機(jī)一直初始化的知識(shí),希望能夠幫助到大家!
