实现1sym转换成2个sym送给CVI(VGA数据)
CVI的时序如下 :de指示数据有效。
从下面的程序看,同步码的长度不会影响对有效数据的判断。同步码的作用更多的是用于计算行及一行的像素数目。
方案一:
1 module vga_1sym_2_2sym(
input clk_i,
input rst_p,
input [:] data_i,
input h_sync_i,
input v_sync_i,
input de_i , output [:] data_o,
output [:] h_sync_o,
output [:] v_sync_o,
output [:] de_o,
output vga_clk_o ); wire ctrl_clk;
wire vga_clk;
wire vga_clk_dvi2;
clkctrl u0_clkctrl (
.inclk (clk_i), // altclkctrl_input.inclk
.outclk (ctrl_clk) // altclkctrl_output.outclk
);
iopll u0 (
.rst (rst_p), // reset.reset
.refclk (ctrl_clk), // refclk.clk
.locked (), // locked.export
.outclk_0 (vga_clk), // outclk0.clk
.outclk_1 (vga_clk_dvi2) // outclk0.clk
); reg [:] data_r;
reg [:] vga_data_dly2;
reg [:] vga_data_dly3;
reg h_sync_r = ;
reg v_sync_r = ;
reg de_r = ;
always @( posedge vga_clk )
begin
data_r <= data_i;
h_sync_r <= h_sync_i;
v_sync_r <= v_sync_i;
de_r <= de_i;
end
// reg [1:0] de_dly = 2'b00;
// always @( posedge vga_clk )
// begin
// de_dly[1:0] <= {de_dly[0],de_i};
// end
// wire pos_de = (de_dly[1:0] == 2'b01 );
reg h_l_cnt = 'b0;
always @( posedge vga_clk )
begin
// if( pos_de )
// h_l_cnt <= 1'b1;
// else
h_l_cnt <= ~h_l_cnt;
end
reg [:]data_r2 = ;
reg [:] h_sync_r2 = 'b00;
reg [:] v_sync_r2 = 'b00;
reg [:] de_r2 = 'b00;
always @( posedge vga_clk )
begin
if( h_l_cnt ) begin
data_r2[:] <= data_r;
h_sync_r2[] <= h_sync_r;
v_sync_r2[] <= v_sync_r;
de_r2[] <= de_r; end else begin data_r2[:] <= data_r;
h_sync_r2[] <= h_sync_r;
v_sync_r2[] <= v_sync_r;
de_r2[] <= de_r;
end
end
reg vga_cvi_valid = ;
always @( posedge vga_clk )
begin
if( ~h_l_cnt )
vga_cvi_valid <= 'b1;
else
vga_cvi_valid <= 'b0; end // assign data_o = data_r2;
// assign h_sync_o = h_sync_r2;
// assign v_sync_o = v_sync_r2;
// assign de_o = de_r2; wire rd_empty;
wire [:] fifo_dout;
reg [:] rd_empty_r = 'b00;
wire rd_en ;
fifo_w22 u0_fifo_w22 (
.data ({data_r2,h_sync_r2,v_sync_r2,de_r2}), // fifo_input.datain
.wrreq (vga_cvi_valid), // .wrreq
.rdreq (rd_en), // .rdreq
.wrclk (vga_clk), // .wrclk
.rdclk (vga_clk_dvi2), // .rdclk
.q (fifo_dout), // fifo_output.dataout
.rdempty (rd_empty), // .rdempty
.wrfull () // .wrfull
);
always @( posedge vga_clk_dvi2 )
begin
rd_empty_r <= {rd_empty_r[],rd_empty};
end
assign rd_en = ~rd_empty_r[];
assign {data_o,h_sync_o,v_sync_o,de_o} = fifo_dout;
assign vga_clk_o = vga_clk_dvi2;
endmodule
现在用一种更简单的方式即可实现,
方案二:
module vga_1sym_2_2sym(
input clk_i,
input rst_p,
input [:] data_i,
input h_sync_i,
input v_sync_i,
input de_i , output [:] data_o,
output [:] h_sync_o,
output [:] v_sync_o,
output [:] de_o,
output vga_clk_o,
output vga_valid_o );reg [:] data_r;
reg [:] vga_data_dly2;
reg [:] vga_data_dly3;
reg h_sync_r = ;
reg v_sync_r = ;
reg de_r = ;
always @( posedge vga_clk )
begin
data_r <= data_i;
h_sync_r <= h_sync_i;
v_sync_r <= v_sync_i;
de_r <= de_i;
end
// reg [1:0] de_dly = 2'b00;
// always @( posedge vga_clk )
// begin
// de_dly[1:0] <= {de_dly[0],de_i};
// end
// wire pos_de = (de_dly[1:0] == 2'b01 );
reg h_l_cnt = 'b0;
always @( posedge vga_clk )
begin
// if( pos_de )
// h_l_cnt <= 1'b1;
// else
h_l_cnt <= ~h_l_cnt;
end
reg [:]data_r2 = ;
reg [:] h_sync_r2 = 'b00;
reg [:] v_sync_r2 = 'b00;
reg [:] de_r2 = 'b00;
always @( posedge vga_clk )
begin
if( h_l_cnt ) begin
data_r2[:] <= data_r;
h_sync_r2[] <= h_sync_r;
v_sync_r2[] <= v_sync_r;
de_r2[] <= de_r; end else begin data_r2[:] <= data_r;
h_sync_r2[] <= h_sync_r;
v_sync_r2[] <= v_sync_r;
de_r2[] <= de_r;
end
end
reg vga_cvi_valid = ;
always @( posedge vga_clk )
begin
if( ~h_l_cnt )
vga_cvi_valid <= 'b1;
else
vga_cvi_valid <= 'b0; end assign data_o = data_r2 ;
assign h_sync_o = h_sync_r2 ;
assign v_sync_o = v_sync_r2 ;
assign de_o = de_r2 ;
assign vga_clk_o = vga_clk;
assign vga_valid_o = vga_cvi_valid;
end
该实现过程与方案一相比,节省了PLL和FIFO,但输出了一个vga_valid_o信号,该信号连接到CVI的vid_datavalid信号。以下是vid_datavalid信号的定义:
意思是,CVI II IP核只在vid_datavalid为高电平时,才会读取vid信号,该信号用于CVI支持视频信号的过采样。也就是同一个像素对应多个时钟的情况下,只需要一个时钟的数据即可。
原本我的想法是让vid_datavalid始终保持高电平状态,通过vga_cvi_valid信号控制de_o翻转,间隔一个时钟数据有效一次(其实在实现时v_sync_o,h_sync_o都有翻转,目前觉得可能不翻转h,v信号也许可行),但是画面很不正常。de_o的作用是指示vid_data是有效数据。
方案三:
尝试上面提到的h,v不翻转。保持vid_datavalid始终为高电平。
经过验证,可能不行。
实现1sym转换成2个sym送给CVI(VGA数据)的更多相关文章
- 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据
领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...
- GUID转换成16位字符串或19位数据(确保唯一)
// <summary> /// 根据GUID获取16位的唯一字符串 /// </summary> /// <param name=\"guid\"& ...
- C#将DataTable转换成list的方法
本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary> /// 酒店评论列表-分页 /// </su ...
- list<?>转换成 对应的 class
项目中用到的,list转换成bean.因为查询出来的数据用list 泛型接收,要返回 实体对象.所以需要对应转换. 主要用到的技术:反射. 上代码: public static <T> L ...
- Linux下ffmpeg添加Facebook/transform代码块实现将全景视频的球模型转换成立方体模型
Facebook事实上已开始在平台中支持360度全景视频的流播,但公司对此并不满足.其工程师更是基于锥体几何学设计出了一套全新的视频编码,号称最高能将全景视频的文件大小减少80%.(VR最新突破:全景 ...
- DataTable 转换成 Json的3种方法
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- C#将Word转换成PDF方法总结(基于Office和WPS两种方案)
有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然 ...
- DataTable转换成IList<T>的简单实现
DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...
随机推荐
- mysql中的 随机字符串的生成
方法1. SELECT SUBSTRING(MD5(RAND()),FLOOR(RAND()*26)+1,6) AS rand_str; 上诉示例产生的是:6位长度的随机字符串. 函数解释: rand ...
- build.js
// https://github.com/shelljs/shelljs// 检查NodeJS和npm的版本require('./check-versions')() process.env.NOD ...
- linux修改hosts
vim /etc/hosts
- YII2中分页组件的使用
当数据过多,无法一页显示时,我们经常会用到分页组件,YII2中已经帮我们封装好了分页组件. 首先我们创建操作数据表的AR模型: <?php namespace app\models; use y ...
- localstorage和vue结合使用2
html <template> <div class="hello"> <div class="page-top"> < ...
- 3.Mysql支持的数据类型
3.Mysql支持的数据类型数据类型用来指定一定的存储格式.约束和有效范围.数据类型主要有:数值类型.字符串类型.日期和时间类型.3.1 数字类型类型名 字节数 有符号最小值 有符号最大值 无符号最小 ...
- C++中find_if
总结:find_if针对查找的对象中包含指针需要进行比较 find则更偏向于普通的数值或者字符比较 两者都可以应用于自定义的类,只需在类中重载==运载符 函数调用符()说白了其实就是代替函数指针,调用 ...
- DataStructure.BloomFilter
Bloom Filters Ref[1] 1. 简介 Bloom filter(布隆过滤器:有更好的或正确的翻译,告诉我) 是一个数据结构,该数据结构快速并且内存高效,它可以告诉你某个元素是否在集合中 ...
- javascript 高级程序设计 六
上一节还有一个注意的地方:建议所有函数的必需参数使用命名参数,而非必须的参数使用对象来封装. 通过这几天的读书,发现了一个深入了解所学知识的一个捷径——读书.本来我在计算机这方法的所有知识一般都是从视 ...
- HDOJ4734 F(x)
原题链接 数位\(DP\),继续套记搜模板 定义\(f[pos][now]\),\(pos\)是枚举到的位数,\(now\)是\(A\)的权值减去当前枚举的数的权值,即剩余权值大小. 然后就是记搜模板 ...