VGA(DVI interface) Controller的高层次综合

// 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

你可能感兴趣的:(HLS)