
1 //TFT请求 2 assign TFT_req = (cnt_h >= H_SYNC + H_BACK - 1) && (cnt_h < H_SYNC + H_BACK + H_ADDR - 1) && 3 (cnt_v >= V_SYNC + V_BACK ) && (cnt_v < V_SYNC + V_BACK + V_ADDR ) //行数据没有减一,因为cnt_v占很多周期,不需要考虑延时 4 ? 1'b1 : 1'b0;
考虑到TFT请求信号在(cnt_v >= V_SYNC + V_BACK ) && (cnt_v < V_SYNC + V_BACK + V_ADDR ) 中并没有 - 1操作,因为只需要对像素提前以为就行了,提前一个像素就是提前一拍问sdram读fifo要数据,下一拍数据就来了。刚好时序就对齐了


按照上图的代码,第0个数据的坐标是(1,1)

关于数据请求信号,数据有效信号,以及数据坐标。我在看了野火的教材后发现以上的代码视乎有点问题
//rgb_valid:VGA有效显示区域 assign rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT) && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID)) &&((cnt_v >= V_SYNC + V_BACK + V_TOP) && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID))) ? 1'b1 : 1'b0; //pix_data_req:像素点色彩信息请求信号,超前rgb_valid信号一个时钟周期,这样在vga_pic中的时序电路延后之后刚好与实际的像素数据对齐。 assign pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1) && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1)) &&((cnt_v >= V_SYNC + V_BACK + V_TOP) && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID))) ? 1'b1 : 1'b0; //pix_x,pix_y:VGA有效显示区域像素点坐标 assign pix_x = (pix_data_req == 1'b1) ? (cnt_h - (H_SYNC + H_BACK + H_LEFT - 1'b1)) : 10'h3ff; //比实际的坐标要小,为了在后面的时序逻辑中使数据和真正的坐标对应 assign pix_y = (pix_data_req == 1'b1) ? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'h3ff; //rgb:输出像素点色彩信息 assign rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;
可以看到pix_x 和pix_y的确是以请求信号为准,但是对于Y轴并没有 - 1,需要注意的是 请求信号相比于rgb_valid信号要快一拍,而且只是对于行信号而已,对场信号并不存在快一拍的情况
H_SYNC + H_BACK + H_LEFT = 144 ,那么当如果没有 - 1,则 144 - 144 = 0,如果H_SYNC + H_BACK + H_LEFT - 1'b1,则 143 - (144 - 1) = 0,所有当cnt_h = 143时,pix_x就为0,如果没有 - 1,则cnt_h = 144时,pix_x才为0;
关于TB文件中参数的重定于,可以使用defparam 例化文件.参数 = XXX ;来定义。