距离上次的博客已经有段时间了,这写些日子一直在调SDRAM的模块以及文档的书写,SDRAM的子模块比较多,包括init(初始化模块)、refresh(刷新模块)、write(写模块)、read(读模块),使用起来相比之前的USB控制模块、今天的GEN_FRAME(以下均表示为成帧模块)都稍显复杂一些。好了,接下来介绍我们今天的主角:成帧模块。成帧模块的作用有两个:
2.SDRAM写完一行数据后等待写下一行的命令(read_req),GEN_FRAME继续向USB W_FIFO写入数据(w_flag有效),直到写完一行后等待。当PC将W_FIFO中数据读完,即flag_C==0时,read_req有效。
3.当read_req有效时,下一行开始传输,GEN_FRAME中的FIFO同时进行读写(SDRAM向GEN_FRAME中的FIFO中写,同时将GEN_FRAME中的数据读出到USB W_FIFO)。
4.直到读完一帧图像后(即行计数row_cnt计满),read_req无效,w_flag无效,停止读写。
2接口定义
3关键信号时序
A)读GEN_frame数据到USB W_FIFO
① Sdram存完一帧数据后发送read_start信号,经夸时钟域处理后得到read_start_48,在此信号后检测到flag_C为0(即W_FIFO为空),因此要将read_start_48做延展,得到read_start_buf,取它的下降沿为读一帧数据开始。
② 检测到read_start_buf的下降沿后将w_usb_flag_reg拉高,同时w_usb_cnt开始计数,由于数据给出客观上延时一拍才能读到,所以讲使能信号延时一拍发出,即w_usb_flag。该信号为传入下一级的使能信号。
③ 一行数据读出后,继续检测flag_C=0时,F_read_req(向GEN FIFO发送读请求),r_fifo_en与w_usb_flag一致,同时读出fifo中的数据r_fifo_data。
注意:根据同步fifo的经验,这里的r_fifo_en本应该提前数据一拍给出,但上面写到同时读出fifo数据。没错,根据代码发现,异步fifo的读使能r_fifo_en与读数据r_fifo_data居然是同一时刻给出来!!!!!
④ 每读完一行数据我们的行计数gen_cnt_row要加一。这里的行计数是由w_usb_flag_reg的下降沿来触发目的是保证不要丢数据。
⑤ 最终GEN_FRAME输出数据w_data根据行号来选择,gen_cnt_row=0选择zhen_data,否则选择fifo_data。
注意:这里面的gen_cnt_row要记到row_cnt+1(帧头)。
B)sdram向GEN_FRAME FIFO中写数据
① 利用sdram时钟检测flag_C的下降沿,产生read_req,并输出到sdram控制模块中。
② 检测到read_req为高时,sdram将数据传入GEN模块,cnt_data开始计数,计数器由SD_data_v使能信号控制(读sdram被刷新打断,数据会被打断),计数到499停止。
③ 写入fifo的数据为512个16bit的数据,数据只有500个,所以要补12个16bit的数据零,cnt_12从cnt_data==499时开始计数,计到11为止。
将SD_data_v与cnt_12_flag作或操作,时序赋值给w_fifo_en。数据时序赋值给w_fifo_data。分别为写入fifo的使能信号与数据信号。
文章评论(0条评论)
登录后参与讨论