星期六, 6月 28, 2008

Arm Integrater 進展

2008/6/28 (六) 天氣情

動機:
Soc Design and Implementation期末報告,為了解MYIP 動作原理,寫一組自己的功能並能正常的動作於FPGA之上。原Lab6為一個BMP to JPEG 、JPEG to BMP 的 Encoder/Decoder,除了DCT以外,其他的動作皆由 C 處理。DCT為 Verilog code,synthesize 後放入FPGA執行。

構想:
  • 第一步 將Quantization步驟從SW加入HW,使其Performance 加速。
  • 第二步 可以再將 Predict (減法) 及 ZigZag ( Table Index )納入。
  • 第三步 Huffman Encode 納入。
  • 第四步 將上述完成後的功能再分離拆解,再修改為PipeLine 。
實驗步驟:
  1. 因有號數除法器以第三版除法實做,佔用Clock數較長,修改原先 nop 機制,加入Done 機制,在Software 端以 Polling 方式判斷暫存器,以判斷硬體是否完成。
  2. 首先將原始BMP 修改為 64x64 pixel,加速硬體模擬速度。
  3. 改寫原始Software( C code ) ,將不必要使用的Function移除,並改寫主要Encode方式,使其能易於分離出 Y/U/V易於控制。
  4. 將Quantization Table 讀入 Register,(宣告 reg[31:0] QTable[7:0][7:0] ),並於Read/write address訂於 0xcc000100,加入MyIP。
  5. 撰寫一有號數除法,並於Modelsim 上以 TestBench 驗證之,並加入MyIP。
  6. 在MyIP DCT 部分,施作二維DCT時,在第二維DCT每一列完成時,直接運算Quantization。
  7. Quantization部分,優先測試 U/V,而Y 先以Software ChanDCT + Software Quantization,避免整個畫面因HW失敗而完全不知道哪裡有問題,至少可先保留Y(亮度)。

問題討論:
  • 在第一步一開始就遇到許多的困難點,修改為Done 機制時就卡了一整天,不知為何一直無法存取該 Done Register,Code 看起來沒有問題,結果耕學學長在昨天發現,主機的S1 switch,S1 全部撥到OFF,正確的應該是要全部S1[1]On/ S1[2-4]Off,他也玩了一整天,而我們燒錄的brd檔,Flash 燒錄的Address為 0x20000000,這是一個嚴重的問題,也就是說全班同學在做Lab6時,所用的brd檔,所燒錄的程式並非自己燒的東西,而是版子上原有的Code( 0x00000000),修正Jump問題後,將版子調成燒錄到0x20000000,Done 機制完成了,可以動作了,真是慘痛的Switch,花了一整天。
  • 讀出來的Image還是錯誤的,回頭再從頭檢查,從Quantization Table開始,讀進Register後,再從C 讀回來發現,還是有問題,讀出來的值有時會變動、有時都是0,暈~,想想會不會又是HW問題,耕學說可能是那塊Flash 被我玩壞掉,試圖再將Switch 調到 0x00000000,brd 跟著燒到該位置,經過測試後,寫入Reg 跟讀出正常,此一步驟確認完成,沒問題
  • 影像還是出不來,天呀~,懷疑是除法器,不過有人說在Modelsim上是沒問題的不代表在FPGA上沒問題,好那單獨把除法加到MYIP,為屏除人為操作及機器問題,同時也換一台機器,此一步驟由Stenly、耕學測試,Stenly及耕學測試除法器沒問題
  • 還是不會動,懷疑是DCT後接除法流程問題,於是:
    • 在MyIP 加入一個 reg[31:0] div_ans[60]並Mapping 到0xcc000200,將除法器每一個Clock 的結果存入div_ans,並於Software讀回。
    • 天呀,又是 全 0

  • 2008/6/30 回頭想了一下耕學講的那個SWITCH,怪怪的,查了一下手冊DUI0098B_AP_UG.pdf裡,2-3 Setting the DIP switches
    • S1[1]

      S1[2]

      S1[3]

      S1[4]

      Function

      On

      x

      x

      x

      Code Starts execution from boot ROM followin.

      Off

      x

      x

      x

      Code starts execution from flash following rest.

    • 跟Stenly討論的結果:
      • 原則上...如果REMAP=0
        當 S1[1]=ON 時....memory 0x0 = 使用AP Boot ROM
        當 S1[1]=Off 時....memory 0x0 = 使用AP Flash
    • 這裡應該是全部調成Off 來跑才對,但奇怪的是為何給的brd檔都是寫到0x20000000。
    • 而Progcards.pdf 文內提到
      • Note that default address for the AP system flash programming is 0x24000000.
      • 這三者的關係怪怪的( 0x0、0x20000000、0x24000000)。
結論:
  • 深了,每次都是坐最後一班火車,快來不及了,搞了三個星期還卡在第一步。
  • 除法器在Modelsim 上撰寫含測試,不到30分鐘,拿到FPGA上燒錄及驗證也不到30分鐘,將DCT 與 Quantization 整合在一起花了三個星期還在搞,這樣子搞一個IP真的好久,而且好難驗證,Arm Integrater上的ICE 拔來拔去,電源開開關關,我看我燒了不下百次,這樣沒多久就會被我玩壞掉。
  • 這樣的Debug 模式真的是正確的嗎?我是不是漏了甚麼方式,或是應該用別種方式先做才是正確的?
  • 現在遇到的問題好像已經不是寫Verilog 的問題,而是整合上的問題,不知道要從哪裡去區分了,該切的也切開來測了,邏輯上都對,但跑起來就是不對。
  • 這東西只能在學校測,還好有耕學,陪著我們做了好幾個星期六,不然都不知去哪測了,也沒有小台一點的Arm Integrater可以玩,真難搞。
  • 老師體諒我們學生,只要做個除法器,不過我把寫報告的時間都拿來做實驗了‧‧‧,上了一學期的課,只能做個除法器 -.-|||,太丟臉了,交不太出去。

2 則留言:

史丹利 提到...

嗯S1[4:1]這4個開關在LM裏還有別的用途
主要是用來Configuring the Xilinx FPGA from flash
當S1[3] = Closed並且motherboard存在時,CFGSEL[1:0]及S1[1]決定使用那一個Flash
當S1[3] = Open並且motherboard不在時,S1[1]及S1[2]決定使用那一個Flash

不過這裏我尚有一些地方想不通,今天我沒什麼時間,你再幫我問問耕學吧,主要是brd的問題
我看不是很明白,brd設定檔是如何去決定什麼情況是燒FPGA,什麼情況是燒Flash,為什麼有的brd會有lmxcv600e_72c_xcv2000e_via_reva_build0.bit或LM_flash_load.bit,老師是有提到那是因為partition的問題,但...我還是不明白@@
如果這個問題了解了,address的問題我可能就有答案了。

史丹利 提到...

OK了,原則上應該是了解了progcards及brd在幹麻了.重點在於Address的設定及switch的調整,之前的S1[1]及S1[3]的設定應是有誤的.
S1[3]最好設成Open如此一來S1[1]Closed則FPGA讀取Flash Base Address=0x000000
S1[1]Open則FPGA讀取Flash Base Address=0x200000
詳細資料,請看我寫的文件.