FPGA之VGA转HDMI之编码模块的编写
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之编码模块的编写相关推荐
- FPGA之VGA转HDMI之并行串行转换模块编写
上节我们使用编码模块可解决图像数据的编码问题,而这次使用的并行转串行模块的主要功能就是实现并行串行转换.单端信号转差分信号.单沿采样转双沿采样. 并行转串行模块框图如下 ...
- FPGA的学习:HDMI显示器驱动设计与验证
HDMI的顶层模块设计如图所示: 其中包含了一个时钟产生电路,vga_pic模块,vga_ctrl模块,hdmi_ctrl模块. 各个模块的设计图如下: 其中还要用到一个encode模块: 还要用到p ...
- 显卡+接口+VGA+DVI+HDMI+DP
显卡+接口+VGA+DVI+HDMI+DP 转换器:常见VGA和DVI之间的转换器 HDMI包含:Type A + Type B + Type C + Type D DVI包包含:DVI-A + DV ...
- FPGA实现VGA显示(六)——————多字符显示及基于fpga的“打字机”实现
前面笔者总结了如何显示单字符,设立通过一个简单的任务来总结如何实现vga多字符显示. 实验要求 基础: 由PC通过UART发送数据在VGA显示.数据可以为字母,数字,汉字(任选10个字),VGA分为左 ...
- FPGA实现VGA显示(三)——————单个字符显示
这里笔者首先记录一个问题,给自己提个醒,所有的模块都有一点点的问题,在行数列数都可能有一行像素的误差,有可能是在驱动和显示模块的问题,等后面修改,这里第一次做,只要不影响显示,实现功能. 字符显示只修 ...
- 基于FPGA的VGA/LCD显示控制器设计(中)
今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...
- 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分
目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...
- 基于FPGA的VGA协议实现
基于FPGA的VGA协议实现 一.VGA简述 1.VCG接口 2.原理 3.显示器扫描 4.VGA时序分析 5.VGA时钟计算 6.不同分辨率的VGA参数 二.显示彩条 1.色彩原理 2.彩条输出 三 ...
- imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊
写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...
最新文章
- Skpi List跳表
- Lighttpd源码分析之状态机与插件
- kernel module required key not available
- 硬件基础 —— 二极管
- 计算机一级b考试教程,全国计算机等级考试一级B教程
- 都9012年了,还有人说IntelliJ IDEA不好用?那是因为没掌握这些技巧。
- 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...
- 总结替换jar包中指定文件的步骤
- java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
- Pycharm 设置python文件自动生成头部信息模板
- redis作用_Java高级架构笔记——实现故障恢复自动化:详解Redis哨兵技术
- Educational Codeforces Round 43 (Rated for Div. 2)题解
- s3c2440中蜂鸣器的打开与关闭
- CTO、技术总监、首席架构师的区别
- 实时应用监控平台CAT
- 蓝牙耳机连接苹果手机成功,但是手机音乐依然外放。
- layui自定义工具栏
- 浅谈共线性的产生以及解决方法(上篇——前世)
- Hive 随机取样-抽样查询
- soft lockup问题的定位方法