VGA 图像信息到 HDMI 图像信息的转化需要对输入的 VGA 图像信息进行编码、并行串行转换、单端信号转差分信号、单沿采样转双沿采样。

其中,编码模块就是为了完成 VGA 图像数据 8b 转 10b 的编码。其结构框图如下所示:

图1 编码模块框图

图2 编码模块输入输出信号功能框图

图3 编码模块参考流程图

图4 编码模块参考流程图参数说明

下面我们依据HDMI官方手册中的流程图(图3)进行 HDMI 8bit 转 10bit 的代码编写:

module encode
(input  wire       vga_clk   ,   //时钟信号input  wire       sys_rst_n ,   //复位信号,低电平有效input  wire       hsync     ,   //行同步信号input  wire       vsync     ,   //场同步信号input  wire       rgb_vaild ,   //使能信号input  wire [7:0] data_in   ,   //输入8bit待编码数据output reg  [9:0] data_out      //输出编码后的10bit数据
);//parameter define
parameter   DATA_OUT0   =   10'b1101010100 ,DATA_OUT1   =   10'b0010101011 ,DATA_OUT2   =   10'b0101010100 ,DATA_OUT3   =   10'b1010101011 ;//wire define
wire      ctrl_1  ;   //条件1
wire       ctrl_2 ;   //条件2
wire       ctrl_3 ;   //条件3
wire [8:0] q_m    ;   //转换后9bit数据//reg define
reg [3:0] data_in_n1  ;  //待编码数据中1的个数
reg [7:0] data_in_reg ;  //待编码数据打一拍
reg [4:0] cnt         ;
reg [3:0] q_m_n1      ;  //转换后9bit数据1的个数
reg [3:0] q_m_n0      ;  //转换后9bit数据0的个数
reg [9:0] q_m_reg     ;  //q_m信号打一拍
reg       de_reg1     ;  //使能信号打一拍
reg       de_reg2     ;  //使能信号打两拍
reg       hsync_reg1  ;  //控制信号hsync打一拍
reg       hsync_reg2  ;  //控制信号hsync打两拍
reg       vsync_reg1  ;  //控制信号vsync打一拍
reg       vsync_reg2  ;  //控制信号vsync打两拍//data_in_n1:待编码数据中1的个数
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)data_in_n1 <= 4'd0 ;else data_in_n1 <= data_in[0] + data_in[1] + data_in[2] + data_in[3] + data_in[4] + data_in[5] + data_in[6] + data_in[7] ;//data_in_reg:待编码数据打一拍
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)data_in_reg <= 4'd0 ;elsedata_in_reg <= data_in ;//ctrl_1:条件1
assign ctrl_1 = ((data_in_n1 > 4'd4) || ((data_in_n1 == 4'd4) && (data_in_reg[0] == 1'b0))) ? 1'b1 : 1'b0 ;//q_m:第一阶段转换后9bit数据
assign q_m[0] = data_in_reg[0] ;
assign q_m[1] = (ctrl_1 == 1'b1) ? (q_m[0] ^~ data_in_reg[1]) : (q_m[0] ^ data_in_reg[1]) ;
assign q_m[2] = (ctrl_1 == 1'b1) ? (q_m[1] ^~ data_in_reg[2]) : (q_m[1] ^ data_in_reg[2]) ;
assign q_m[3] = (ctrl_1 == 1'b1) ? (q_m[2] ^~ data_in_reg[3]) : (q_m[2] ^ data_in_reg[3]) ;
assign q_m[4] = (ctrl_1 == 1'b1) ? (q_m[3] ^~ data_in_reg[4]) : (q_m[3] ^ data_in_reg[4]) ;
assign q_m[5] = (ctrl_1 == 1'b1) ? (q_m[4] ^~ data_in_reg[5]) : (q_m[4] ^ data_in_reg[5]) ;
assign q_m[6] = (ctrl_1 == 1'b1) ? (q_m[5] ^~ data_in_reg[6]) : (q_m[5] ^ data_in_reg[6]) ;
assign q_m[7] = (ctrl_1 == 1'b1) ? (q_m[6] ^~ data_in_reg[7]) : (q_m[6] ^ data_in_reg[7]) ;
assign q_m[8] = (ctrl_1 == 1'b1) ? 1'b0 : 1'b1 ;//q_m_n1:转换后9bit数据中1的个数
//q_m_n0:转换后9bit数据中0的个数
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)begin q_m_n0 <= 4'd0 ;q_m_n1 <= 4'd0 ;endelse beginq_m_n1 <= data_in[0] + data_in[1] + data_in[2] + data_in[3] + data_in[4] + data_in[5] + data_in[6] + data_in[7] ;q_m_n1 <= data_in[0] - (data_in[1] + data_in[2] + data_in[3] + data_in[4] + data_in[5] + data_in[6] + data_in[7]) ;end//ctrl_2:条件2
assign ctrl_2 = (cnt == 5'd0) || (q_m_n0 == q_m_n1) ? 1'b1 : 1'b0 ;//ctrl_3:条件3
assign  ctrl_3 = (((cnt >= 5'd0) && (q_m_n1 > q_m_n0))|| ((cnt <= 5'd0) && (q_m_n0 > q_m_n1))) ? 1'b1 : 1'b0 ;//数据打拍,为了个数据同步
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)beginq_m_reg    <= 1'b0 ;de_reg1    <= 1'b0 ;de_reg2    <= 1'b0 ;hsync_reg1 <= 1'b0 ;hsync_reg2 <= 1'b0 ;vsync_reg1 <= 1'b0 ;vsync_reg2 <= 1'b0 ;end    else        beginq_m_reg    <= q_m_reg    ;de_reg1    <= rgb_vaild  ;de_reg2    <= de_reg1    ;hsync_reg1 <= hsync      ;hsync_reg2 <= hsync_reg1 ;vsync_reg1 <= vsync      ;vsync_reg2 <= vsync_reg2 ;end             //data_out:输出编码后的10bit数据
//cnt:视差计数器,0-1个数差别,最高位为符号位
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)begindata_out <= 10'b0 ;cnt      <= 5'd0  ;endelsebegin   if(de_reg2 == 1'b1)beginif(ctrl_2 == 1'b1)begindata_out[9]   <= ~q_m_reg[8] ;data_out[8]   <= q_m_reg[8]  ;data_out[7:0] <= (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt <= (q_m_reg[8] == 1'b0) ? (cnt + q_m_n0 - q_m_n1) : (cnt + q_m_n1 - q_m_n0);endelsebeginif(ctrl_3 == 1'b1)begindata_out[9]     <= 1'b1;data_out[8]     <= q_m_reg[8];data_out[7:0]   <= ~q_m_reg[7:0];cnt <=  cnt + {q_m_reg[8], 1'b0} + (q_m_n0 - q_m_n1);endelsebegindata_out[9]     <= 1'b0;data_out[8]     <= q_m_reg[8];data_out[7:0]   <= q_m_reg[7:0];cnt <=  cnt - {~q_m_reg[8], 1'b0} + (q_m_n1 - q_m_n0);endendendelsebegincase({vsync_reg2,hsync_reg2})2'b00:  data_out <= DATA_OUT0;2'b01:  data_out <= DATA_OUT1;2'b10:  data_out <= DATA_OUT2;default:data_out <= DATA_OUT3;endcasecnt <=  5'b0;                    endend
endmodule

FPGA之VGA转HDMI之编码模块的编写相关推荐

  1. FPGA之VGA转HDMI之并行串行转换模块编写

            上节我们使用编码模块可解决图像数据的编码问题,而这次使用的并行转串行模块的主要功能就是实现并行串行转换.单端信号转差分信号.单沿采样转双沿采样.         并行转串行模块框图如下 ...

  2. FPGA的学习:HDMI显示器驱动设计与验证

    HDMI的顶层模块设计如图所示: 其中包含了一个时钟产生电路,vga_pic模块,vga_ctrl模块,hdmi_ctrl模块. 各个模块的设计图如下: 其中还要用到一个encode模块: 还要用到p ...

  3. 显卡+接口+VGA+DVI+HDMI+DP

    显卡+接口+VGA+DVI+HDMI+DP 转换器:常见VGA和DVI之间的转换器 HDMI包含:Type A + Type B + Type C + Type D DVI包包含:DVI-A + DV ...

  4. FPGA实现VGA显示(六)——————多字符显示及基于fpga的“打字机”实现

    前面笔者总结了如何显示单字符,设立通过一个简单的任务来总结如何实现vga多字符显示. 实验要求 基础: 由PC通过UART发送数据在VGA显示.数据可以为字母,数字,汉字(任选10个字),VGA分为左 ...

  5. FPGA实现VGA显示(三)——————单个字符显示

    这里笔者首先记录一个问题,给自己提个醒,所有的模块都有一点点的问题,在行数列数都可能有一行像素的误差,有可能是在驱动和显示模块的问题,等后面修改,这里第一次做,只要不影响显示,实现功能. 字符显示只修 ...

  6. 基于FPGA的VGA/LCD显示控制器设计(中)

    今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...

  7. 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

    目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...

  8. 基于FPGA的VGA协议实现

    基于FPGA的VGA协议实现 一.VGA简述 1.VCG接口 2.原理 3.显示器扫描 4.VGA时序分析 5.VGA时钟计算 6.不同分辨率的VGA参数 二.显示彩条 1.色彩原理 2.彩条输出 三 ...

  9. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

最新文章

  1. Skpi List跳表
  2. Lighttpd源码分析之状态机与插件
  3. kernel module required key not available
  4. 硬件基础 —— 二极管
  5. 计算机一级b考试教程,全国计算机等级考试一级B教程
  6. 都9012年了,还有人说IntelliJ IDEA不好用?那是因为没掌握这些技巧。
  7. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...
  8. 总结替换jar包中指定文件的步骤
  9. java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
  10. Pycharm 设置python文件自动生成头部信息模板
  11. redis作用_Java高级架构笔记——实现故障恢复自动化:详解Redis哨兵技术
  12. Educational Codeforces Round 43 (Rated for Div. 2)题解
  13. s3c2440中蜂鸣器的打开与关闭
  14. CTO、技术总监、首席架构师的区别
  15. 实时应用监控平台CAT
  16. 蓝牙耳机连接苹果手机成功,但是手机音乐依然外放。
  17. layui自定义工具栏
  18. 浅谈共线性的产生以及解决方法(上篇——前世)
  19. Hive 随机取样-抽样查询
  20. soft lockup问题的定位方法

热门文章

  1. ROG 冰刃 3 枪神 2 Plus 第二时间上手体验
  2. itext word转pdf,中文标点换行问题
  3. 紫光扫描仪ocr_清华紫光OCR下载
  4. SuperMap 许可简介
  5. 短信网关测试 soap
  6. 京东API详情接口调用示例
  7. 局域网中的每台计算机主机扩展槽,计算机导论选择题
  8. 动漫设计与制作计算机专业,计算机动漫设计与制作专业(毕业论文).doc
  9. 周末作业-循环练习题(2)
  10. 一文了解百度信息流:百度电商直播、百青藤、观星盘