|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
// Genarate synch signal to drive DVI output, here 720P is as default
void vga_ctrl(volatile int24 *velXY, volatile uint8 *frameY, struct dvi_video *dvi_o, volatile uint1 *sync_enable)
{
uint12 hcount = 0;
uint11 vcount = 0;
uint1 vga_data_rdenab = 0;
uint1 sync_en = 0;
uint1 video_active;
struct dvi_video tmp_dvi_o;
sync_en = *sync_enable;
loop_while: while(sync_en)
{
if (vcount < FRAME_HEIGHT)
video_active = 1;
else
video_active = 0;
if (video_active && (hcount >= (HSYNC_WIDTH + H_BACK_PORCH)) &&
(hcount < (HSYNC_WIDTH + H_BACK_PORCH + LINE_WIDTH)))
vga_data_rdenab = 1;
else
vga_data_rdenab = 0;
if (vga_data_rdenab)
{
int24 tmp_velXY = *velXY;
uint8 Yij = *frameY;
int12 tmpX,tmpY;
tmpX = (int12)(tmp_velXY>>12);
tmpY = (int12)tmp_velXY;
tmp_dvi_o.de = 1;
tmp_dvi_o.vsync = SYNC_POLARITY_N;
tmp_dvi_o.hsync = SYNC_POLARITY_N;
int32 c = (Yij - 16) * 298;
tmp_dvi_o.red = (uint8)clip(((c + (tmpY>>1)*409 + 128) >> 8),0,255);
tmp_dvi_o.green = (uint8)clip(((c - (tmpX*50) - (tmpY*104) + 128) >> 8),0,255);
tmp_dvi_o.blue = (uint8)clip(((c + (tmpX*258) + 128) >> 8),0,255);
}
else
{
tmp_dvi_o.de = 0;
tmp_dvi_o.red = 0;
tmp_dvi_o.green = 0;
tmp_dvi_o.blue = 0;
tmp_dvi_o.hsync = (hcount < HSYNC_WIDTH) ? SYNC_POLARITY : SYNC_POLARITY_N;
if(vcount >= V_FRONT_PORCH + FRAME_HEIGHT && vcount < V_FRONT_PORCH + VSYNC_WIDTH + FRAME_HEIGHT)
tmp_dvi_o.vsync = SYNC_POLARITY;
else
tmp_dvi_o.vsync = SYNC_POLARITY_N;
}
*dvi_o = tmp_dvi_o;
if (hcount == (H_FRONT_PORCH + HSYNC_WIDTH + H_BACK_PORCH + LINE_WIDTH - 1))
{
hcount = 0;
if (vcount == (V_FRONT_PORCH + VSYNC_WIDTH + V_BACK_PORCH + FRAME_HEIGHT - 1))
vcount = 0;
else
vcount = vcount + 1;
}
else
hcount = hcount + 1;
}
}
这是一个用C实现的VGA控制器的接口模块,其中头文件和上下文没有在这里提供(velXY),是一个视频处理design的一部分,在Xilinx VSK FPGA (spartan3adsp)上进行过原型验证。
高层次综合的约束是对while循环进行pipeline。
一般来说,高层次综合的特长是对数据处理为主的模块进行综合,但是随着工具越来越成熟,这些工具对控制为主的模块进行综合也没有任何问题了。
本文采用的工具:AutoESL公司的AutoPilot |
|