MyFPGA Forum

 找回密码
 注册
搜索
楼主: jeff
打印 上一主题 下一主题

ED2 framebuffer and video capture interface for SOPC

[复制链接]
21#
发表于 2010-3-29 20:59:47 | 只看该作者
回复 17# jeff


    不好意思 另外想請教 uClinux terminal畫面好像是在LCM顯示,這點是如何做的呢?
22#
 楼主| 发表于 2010-3-31 07:46:24 | 只看该作者
回复 21# REN


    我使用的還是pc端的terminal,
    lcm上的那個是nano-x的範例nxterm,由於滑鼠跟鍵盤沒有驅動
     所以我也不知道那個termainal是否能正常運作
23#
发表于 2010-3-31 10:39:33 | 只看该作者
回复 22# jeff


    我了解了 謝謝jeff..版主
24#
发表于 2010-4-3 16:26:50 | 只看该作者
回复 22# jeff


    我後來發現那個範例是 把pc-terminal 的畫面 類似擷圖的方式 show 在uClinux畫面 並不是真的在uClinux 上面 show 出 terminal 。

   是在NIOSWIKI 上面找到 Framebuffer 範例。
25#
发表于 2010-4-10 13:40:32 | 只看该作者
這個 project 太棒了!! 感謝分享~
26#
发表于 2010-4-10 23:57:23 | 只看该作者
回复 19# jeff

jeff 大大您好,我想利用轉換圖層的方法在原本有晶提供的TV box DEMO 上實現外掛字幕的功能。
請問是否可以分享此多圖層疊圖的"專案範例"給我參考。謝謝︿︿

E-MAIL: kay54068@hotmail.com
27#
 楼主| 发表于 2010-4-11 20:36:47 | 只看该作者
回复 26# kay54068


    在連結中已經有附上完整的專案了
     fb0是ccd進來的畫面
     fb1是做osd層用,我有實作一個簡易的繪制字型函式
     然後兩fb做疊圖,基本上該範例應該可以延伸出簡易的osd了
     我有試過刷3個vga(640x480 32bit per pixel )會不夠力畫面會花掉,所以才用lcm(320x240)
    如果要在tv box demo基礎上做osd的話可能要注意一下頻寬的問題
28#
发表于 2010-4-12 14:10:40 | 只看该作者
回复 27# jeff

謝謝jeff大大的指導,之前提出的TV BOX 外掛上字幕目前大致上已經完成。
但輸出至VGA上有時候畫面會花掉(字幕圖缺角),請問是什麼問題呢?
在TV畫面與VGA畫面多圖層多工選擇我用此寫法

assign VGA_Read_DATA = (NIOS_Read_DATA==32'h00000000) ? {TVBlue,TVGreen,TVRed} : NIOS_Read_DATA ;       

VGA_Read_DATA:輸出至 VGA_Controller 的RGB

.iRed(VGA_Read_DATA[9:0]),
.iGreen(VGA_Read_DATA[19:10]),
.iBlue(VGA_Read_DATA[29:20]),
29#
发表于 2010-4-12 14:30:46 | 只看该作者
回复 28# kay54068

會不會是 Deinterlace 的關係??
30#
 楼主| 发表于 2010-4-12 22:20:53 | 只看该作者
回复 28# kay54068


    我想不太到在de2上要怎麼做,基本上刷3個vga(640x480x32bit)就可能會撐不住了
     而且deinterlace就要用sdram做framebuffer,
    如果把資料用經由avalon bus送進來再出去的話應該撐不住,
     不太清楚你是怎麼做到的~

    以下是我的想法你可以參考一下(純想法未知是否可行)
     (1)如果是ccd那個範例想刷3個vga(ccd input +fb0 output + fb1 output)
        可以試著把畫素降為16bit(RGB565),這樣頻寬應該可以撐的住
     (2)tv box,我覺得用de2-70比較可行一個sdram做deinterlace
        另一個sdram給cpu做osd然後把兩個疊圖,效果應該會不錯
    (3)如果你在de2-70你還可以試著把deinterlace後的資料用ccd_if的輸入
         然後用ccd的範例的方式疊圖,但還是要降畫素,
         可以試著降osd層改為1bpp(colorkey+字型色),
          這個好處是可以抓圖,但還要配合sync的信號可能不是很好做…
31#
发表于 2010-4-14 00:29:55 | 只看该作者
本帖最后由 kay54068 于 2010-4-14 00:55 编辑

回复 30# jeff

謝謝jeff大大的指導,我是利用DE2_70 平台去做的。TV-BOX那塊是用 Multi-Port SDRAM 去做Buffer,在VGA DAC輸出是利用多工器切換送進 VGA_Controller 的DATA :
assign VGA_Read_DATA = (NIOS_Read_DATA==32'h00000000) ? {TVBlue,TVGreen,TVRed} : NIOS_Read_DATA ; 。
有幾個問題想請教您:
1.我在NIOSII IDE軟體設計上簡單畫一條線例如:
        for(j=0;j<640;j++){  frame_buffer[1*640+j]=0xffffffff;}
線段會不完整會有幾個地方不會顯示。但我多畫個幾條或下面再顯示ASCII 碼  例如: (drawString("ABCDEF",100,100);)就會正常顯示。
如果我單單輸出一行ASCII 字串的話某些字會有缺口。

2.NIOSII 在做VGA_IF 初始化 中的
        //maxAddr
        maxaddr=(640*480-128)*4;
        IOWR(VGA_IF_0_BASE,7,maxaddr);
        //length
        length=128*4;
        IOWR(VGA_IF_0_BASE,3,length);

       資料的maxaddr為什麼要規劃成(640*480-128)*4 ?
       以及資料長度要規劃成128*4 ?

3.在SOPC Builder 上 Component 的 BASE都要LOCK在我們所設定的位址參數嗎?

PS:我只用一組 DMA 以及 VGA_IF 在Arbitration設置 sdram Controller 是設成 Arbitration(30,30,60)
     我猜想VGA輸出畫面會有問題是不是Arbitration設置上出錯呢?

以上問題,煩請指教^^。
32#
 楼主| 发表于 2010-4-14 21:32:56 | 只看该作者
回复 31# kay54068


    (1)是否有圖可以參考,不知破的情形大概是如何,如果是破圖的話我是猜頻寬問題
           你有提到你使用的是Arbitration(30,30,60),
           如果你的cpu、bus、sdram是在50mhz
        那這組參數有點margin,你可以試試Arbitration(20,20,60),
           如果cpu、bus、sdram都已經拉到100mhz的話那頻寬應該是夠的
     (2)maxaddr是最後一次般資料的開始位置,所以減掉最後一次搬的量
          length=128*4,這是給dma看的,單位是byte,一個畫素是32bits所以是8bits * 4
   (3)我習慣memory map是固定的,先規畫好的,這樣初始硬體的程式碼就會固定
          sopc builder有時候會亂跳,我是調好我想要的就把它lock起來,
          不lock也沒關系,但初始化硬體的程式碼就要check一下是否與實際規劃一致
33#
发表于 2010-4-16 00:17:00 | 只看该作者
本帖最后由 kay54068 于 2010-4-16 00:33 编辑

回复 32# jeff
謝謝大大的回覆,我還是不知道該解決之前所說的問題,目前的Arbitration(30,30,60)-100MZ(在sopc builder中加的pll)。
1.第一次只在y=10,的地方畫一條白線,顯示有問題
  for(j=0;j<640;j++)
       {   frame_buffer2[10*640+j]=0xffffffff; }

2.之後在x=100,y=100的地方顯示ascii字串,白線有顯示出來但字串顯示不完整
    for(j=0;j<640;j++)
    {   frame_buffer2[10*640+j]=0xffffffff; }  
     drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",100,100);  

原始圖

字串部分放大圖


SOPC Builder 設置

軟體主程式

       //dma addr
        IOWR(VGA_IF_0_BASE,4,0x00800820);
        //maxAddr
        maxaddr=(640*480-128)*4;
        IOWR(VGA_IF_0_BASE,7,maxaddr);
        IOWR(VGA_IF_0_BASE,1,&frame_buffer);     
        //writeAddress
        IOWR(VGA_IF_0_BASE,2,0x00800818);
        //length
        length=128*4;
        IOWR(VGA_IF_0_BASE,3,length);
        //master start
        IOWR(VGA_IF_0_BASE,0,0x0001);
       //dma addr
         IOWR(LTM_IF_BASE,4,0x00000080);
      //clear screen
      memset(frame_buffer,0x0,sizeof(frame_buffer));
     
           for(j=0;j<640;j++)
            {   frame_buffer2[10*640+j]=0xffffffff;
             }  

       drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",100,100);

開發環境:Quartus II 9.0 (32-Bit)、Nios II  9.0 IDE
34#
 楼主| 发表于 2010-4-16 08:33:11 | 只看该作者
回复 33# kay54068


    試一下改vga_if中的
    VGA_FIFO u1(
             .aclr(avs_s0_export_fifo_clr),
             .data(avs_s0_writedata),
             .q(avs_s0_export_oDATA_OUT),
             .rdclk(avs_s0_export_eVgaCLK),
             .rdreq(avs_s0_export_erdreq),
             //.wrclk( avs_s0_export_system_clock ),//using cpu clock from external
             .wrclk( csi_clockreset_clk ),
             .wrreq( avs_s0_write),
             .wrusedw(wrusedw)
         );
35#
发表于 2010-4-16 17:27:38 | 只看该作者
本帖最后由 kay54068 于 2010-4-16 17:28 编辑

回复 34# jeff

謝謝大大的回覆,我將vga_if 內的 wrclk 修改成.wrclk( csi_clockreset_clk ),後還次會有之前的問題。
但我在Y=480(如下片段程式)畫一條白線畫面就不會有問題了!請問我是哪裡出錯了呢?
for(j=0;j<640;j++)
               frame_buffer2[480*640+j]=0xffffffff;
36#
 楼主| 发表于 2010-4-16 20:20:24 | 只看该作者
本帖最后由 jeff 于 2010-4-16 20:56 编辑

回复 35# kay54068


    我看了一下你初始的是frame_buffer,畫的是frame_buffer2兩個是指向同一位置嗎
     如果frame_buffer2是對齊frame_buffer,畫面應該是從0~(480*640-1)
     那frame_buffer2[480*640+j]已經超出vga規劃範圍應該不會有畫面呀
     不過你的畫面看來也又沒有差很多,你可以檢是一下frame_buffer的宣告
     或者是把系統cpu bus sdram降到50mhz使用Arbitration(20,20,60)試試
    PS. 可以印一下frame_buffer的位址看看,我不確定如果沒對齊data bus(4 bytes)會有什麼情況
37#
发表于 2010-4-16 23:06:14 | 只看该作者
回复 36# jeff

不好意思,貼錯程式碼。那是之前做兩個VGA_IF一個輸出至VGA一個輸出至LTM的測試,但沒有成功(LTM畫面會不穩)。

alt_32 frame_buffer[640*512];   //VGA display buffer

        //dma addr
        IOWR(VGA_IF_0_BASE,4,0x00800820);
        //maxAddr
        maxaddr=(640*480-128)*4;
        IOWR(VGA_IF_0_BASE,7,maxaddr);
        IOWR(VGA_IF_0_BASE,1,&frame_buffer);     
        
        //writeAddress
       IOWR(VGA_IF_0_BASE,2,0x00800818);
        //length
        length=128*4;
        IOWR(VGA_IF_0_BASE,3,length);
        //master start
        IOWR(VGA_IF_0_BASE,0,0x0001);
      
    memset(frame_buffer,0x0,sizeof(frame_buffer));   
     drawString("abcdefghijklmnopqrstuvwxyz",100,120);
            for(j=0;j<640;j++)
                frame_buffer[480*640+j]=0xffffffff;
有兩個問題請教您:
1.frame_buffer[480*640+j]雖然超出範圍但為何會影響其他位址的畫面輸出(畫面變正常)?
2.上述的問題會有可能是Quartus II版本問題嗎 ( 我VGA_IF是在SOPC Builder 9.0 重新匯入.V檔之後建立出的 VGA_IF_hw.tcl)  ?
38#
 楼主| 发表于 2010-4-17 08:53:15 | 只看该作者
本帖最后由 jeff 于 2010-4-17 08:54 编辑

回复 37# kay54068


     確認一下是否有實作reset的部分
      //reset device and interface fifo
     IOWR(PIO_0_BASE,0,0x0001);
     IOWR(PIO_0_BASE,0,0x0000);
     IOWR(PIO_0_BASE,0,0x0001);
     這個信號會按照順序重設vga_fifo、vga_if、VGA_Controller畫面定位才會正常
      不過你的畫面看來又是穩定的,定位看起來是正確的,掉資料的情況
      看起來像是VGA_Controller跟vga_fifo讀資料結果讀不到,想不到為什麼會這樣
      看你要不要先移掉疊圖的部分看看是否能正常動作
      如果你覺得有可能是軟體的問題,你可以用我之前分享的程式在de2上面試試畫vga是否正常
      我沒de2-70所以沒辦法幫你測,你可能要靠自已了~
    我知道有人有在de2-70上成功執行vga_if跟ccd_if了,但我不確定是否要修改什麼
39#
发表于 2010-5-1 12:44:21 | 只看该作者
回复 1# jeff

請問jeff大大是否有de2-70的範例?? 我CCD_IF在de2-70 跑不起來,不知是什麼原因Frame_Cont 一直不會跑。想請問大大是否有DE2-70的範例可以給我參考一下^^。
40#
发表于 2010-8-22 15:43:05 | 只看该作者
请问版主,那个ucosii里面定义的Buffer数组是存放在Heap里面的吗?还是在SDRAM里面开的一个区域?
程序在SDRAM那一块运行呢?为什么我找不到ccd dma写入数据的目标地址呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-4 08:59 , Processed in 0.054007 second(s), 15 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表