由 DVI[1]解码芯片输入给 fpga的像素时钟信号 Pclk、数据使能信号 DE以及场同步信号 Vsy表示 24bit并行像素数据的同步信息。例如: 1024×512显示分辨率的图像,则在每两个场同步信号 Vsy脉冲之间有 512个“DE=1”的数据有效信号,而在每个“ DE=1”的数据有效信号中有 1024个 Pclk像素时钟信号,如此可将输送的像素数据同步。
写缓冲区控制器直接接收输入的 DVI数据同步信号,在每个 Vsy脉冲来时将写缓冲区写入地址清零,然后在“DE=1”时写缓冲区控制器内的地址计数器计数有效,在每个 Pclk上升沿进行计数加 1操作,这样在每个 DE有效时会产生一行的像素数据地址,再到下一个DE有效时地址计数器又会重新计数,如此循环,而写缓冲区会按照对应的地址将输入的 24bit并行像素数据同步写入缓冲区内。写缓冲区控制器会在地址计数器计数到半行数据地址的时候,向内存控制器发送写缓冲区读请求信号( wcache_rreq)和相应缓冲区地址,要求内存控制器对已写入的半行像素数据以 48bit并行数据格式进行读取,由于内存控制器的等效操作时钟远远高于写缓冲区的写入时钟,因此内存控制器会迅速的将已写入的半行数据读出并停止读数,等待下一个 wcache_rreq的到来,如此便形成了对写缓冲区的乒乓操作,保证了输入像素数据的正确和连续接收,避免产生像素数据漏接和不同步的现象。读缓冲区控制器的设计思路同上,不再赘述。
3.2 内存控制器的设计 [5] [6]
内存控制器里包含主状态机和内存控制模块,如图二所示,主状态机负责对两个缓冲区和片外静态存储器的读写状态控制,共有四个状态——空闲状态、写缓冲区读取状态、读缓冲区写入状态和读写交替状态,用于控制状态机状态转移的信号包括:写缓冲区读请求信号(wcache_rreq)、写缓冲区读取完成信号( r_over)、读缓冲区写请求信号( rcache_wreq)以及读缓冲区写入完成信号 (w_req)。状态机在没有任何操作请求下处于空闲状态,而当其接收到“wcache_rreq”信号时,状态就会随之变为写缓冲区读取状态并进行相应操作,而当读取操作完成后会有“ r_over”信号传入状态机,状态机又会转入空闲状态等待下一信号进入,而当状态机处于写缓冲区读取状态时接收到了“ rcache_wreq”信号,则状态机转入读写交替状态,此时会对写缓冲区和读缓冲区进行交替操作,一旦有一个缓冲区操作完成时会输入相应的操作完成信号,此时状态机即转入对另一缓冲区的单独操作直至操作完成再次进入空闲状态。整个状态转移过程保证了对读写缓冲区操作请求的及时响应,杜绝了由于状态冲突导致的漏操作现象。
系统选用的片外静态存储器的地址总线为 19位,数据总线为 16位,经公式( 1)计算可知采用三片内存的总容量正好可以存储两场 1024×512显示分辨率的图像,这样可以对存储器进行乒乓操作,在存储器内写入一场数据,读取另一场数据,两者交替独立进行。(1)
内存控制模块负责对片外存储器进行控制,其控制信号是两个低电平有效信号[3]:nWE和 nCS。nCS为片选信号,当为高电平时存储器处于非工作状态,此时不能对存储器进行任何操作,低电平时为正常工作状态,可以进行读写操作;nWE为存储器写入信号,当置为低电平时可以对存储器执行写入操作,置为高电平时则可以对存储器执行读取操作。内存控制模块按照主状态机的当前状态来设定两个控制信号的高低电平对片外存储器进行控制。图三为在 QuartusII硬件开发平台上通过逻辑分析仪实际采样出来的片外静态存储器工作时序波形图[6],以中图为例,存储器由写入状态转为读取状态,存储器的地址总线信号和数据总线信号的变化就可看出存储器状态的变化,在写入状态时地址总线按时钟周期发生变化,同时会有 48bit并行数据写入相应内存地址中,而在存储器进入读取状态后,地址总线则变为读取地址,存储器则会在延迟地址总线一个时钟周期后将 48bit数据经由数据总线读出。