zxopenwgb 发表于 2016-12-11 11:09:48

FPGA 驱动SD DDR HDMI实现数码相框

vivado2015.1 开发板AC701;
一、准备8张1920*1080的bmp(24位)图,通过PC存入SD卡;
二、通过WinHex软件和计算确定每张图的起始结束地址;
一张1080p 24位图共有数据(1920*1080*3+54=6220854byte),SD卡每次读出512字节(SD卡用简单的SPI模式、读时序用Single Block Read Operation模式),读完一张图需要发送12151次(6220854/512=12150.105),
所以最后一次读的有些空数据。
('d0~'d12150对应'h0~'h5eec(每次加'h2))
每幅图片的起始结束地址分别为:
1.'h00040000~'h0062ec00;
2.'h00630000~'h00c1ec00;
3.'h00c20000~'h0120ec00;
4.'h01210000~'h017fec00;
5.'h01800000~'h01deec00;
6.'h01df0000~'h023dec00;
7.'h023e0000~'h029cec00;
8.'h029d0000~'h02fbec00;
三、SD卡
1、主时钟30M,进行4分频;
2、初始状态:对各种寄存器复位;
3、SD初始化:上电等待74个时钟、发送CMD0(收到响应'h01)、发送CMD1(收到响应'h00,若没有收到'h00,则继续发送CMD1,连续发送200次);若CMD0收到响应'h01,CMD1收到响应'h00,则说明SD初始化成功。
4、初始化成功后,可以开始读写数据。(写数据用做SD卡调试,在实际显示图片时,只用读就可以了),SD卡与DDR之间用FIFO连接,当判断FIFO中少于一定数据时,则从SD卡读数据写入FIFO。
5、读数据:发送读命令、等待命令响应、等待数据包头、接收数据。
四、SD---->DDR FIFO
写数据宽度8、写深度1024、写时钟30M;
读数据宽度64,读深度128、读时钟DDR控制器产生的100M;
五、DDR控制器(IP)
1、开发板上用1GB DDR3 memory SODIMM,共有8颗128MB的芯片
   单颗容量计算:行地址线复用14根,列地址线复位10根,8个BANK,8根数据线,容量为2的14次方*2的10次方*8*8=1Gbit=128MB,8颗共为1GB
2、FPGA与DDR接口处设置为400M(双沿相当于800M),控制线8颗共用,数据线共为64根;
3、控制器输入时钟200M,单端双端都可;
4、控制器产生的用户时钟100M,用户侧位宽512,FPGA与DDR接口处位宽64,时钟800M(100*512=800*64,总流量一致)
六、DDR接口(读写ARBIT)
1、用DDR用户侧的复位信号判断DDR是否可以开始工作(是否初始化完成,是否读写准备就绪);
2、判断FIFO(SD---->DDR)中是否有一定量的数据,进入写状态、发送写命令、写数据,将数据写入DDR;如果8幅图片都已经导入DDR,则可以不用再进行写操作;
3、从DDR读数据给FIFO(DDR---->HDMI)。
七、DDR---->HDMI FIFO
1、写位宽256,写深度64,写时钟100M;
2、读位宽32,读深度512,读时钟150M;
3、当DDR开始工作,并且FIFO中少于一定的数据,则从DDR中读出数据写入FIFO。这里注意:(1)因为DDR读出数据有延迟,要保证不把FIFO写溢出(2)要满足HDMI的输出要求,不能让HDMI空读FIFO
4、添加复位信号,保证FIFO能长时间正常工作。在帧间隔中间,让FIFO复位足够时间,让(1)DDR读取当前帧的地址复位;(2)复位期间不再向DDR发送读命令;(3)FIFO复位(各指针复位)
八、HDMI输出
1、IIC配置ADV7511芯片(要先配置IIC BUS SWITCH芯片)
2、ADV7511配置信息:
   addr          value
 'h41   -->'h10(all circuit powered up)
   'h15   -->'h00(低4bit,输出数据模式为24 bit RGB 4:4:4,独立的同步信号)
   'h16   -->'h30(输出数据位宽为8bit)
   'h17   -->'h02(输出比例16:9=1920:1080)
   'h98   -->'h03(固定值)
   'h9a   -->'he0(固定值)
   'h9c   -->'h30(固定值)
   'h9d   -->'h61(输入时钟不分频,其它位固定值)
   'ha2   -->'ha4(固定值)
   'ha3   -->'ha4(固定值)
   'he0   -->'hd0(固定值)
   'hf9    -->'h00
   'haf    -->'h04(Disenable HDCP Frame Encryption, DVI模式)
3、IIC读用来调试,在正常使用时不用读;
4、用两个计数器产生同步信号,共1125行,在1112行时产生一行时间的复位信号,复位FIFO(DDR-->HDMI)和DDR读取当前帧地址;
    在1120行读取54字节的BMP文件头信息,读13次,每次读4个字节,读取52字节,还有2个字节跟有效数据一起读出;
5、从FIFO中一次读出4个字节,HDMI一次送出3个字节(RGB),所以HDMI每发送4次只需要从FIFO读取3次。
      

雷磊 发表于 2021-8-13 16:20:50

FPGA 驱动SD DDR HDMI实现数码相框

zxw123 发表于 2021-8-13 17:39:53

FPGA 驱动SD DDR HDMI实现数码相框

LYF 发表于 2021-8-18 16:30:21

FPGA 驱动SD DDR HDMI实现数码相框

雷磊 发表于 2021-8-24 15:30:27

FPGA 驱动SD DDR HDMI实现数码相框
页: [1]
查看完整版本: FPGA 驱动SD DDR HDMI实现数码相框