OpenRisc-27-wishbone接口的vga ipcore的分析与仿真

引言

图形,总是给人直观的感觉。想让ORPSoC能有image/video的输出,是一件很有意义的事情,而VGA就是其中一个不错的选择。

本小节就分析一下一个wishbone接口的vga模块。


1,模块准备

下载:

http://opencores.org/project,vga_lcd


2,模块的architecture



3,模块的使用

这一步需要一点与LCD/vedio相关的知识。我曾经写过一个LCDC的linux driver,并且有数字电视的开发经验,所以理解起来就容易了很多。

这里只把最重要的timing拿来。更过详细信息,请参考内附的spec.

下面这个图要仔细看,真正理解了才行。理解之后,后面的很多事情就好说了。

建议:想象一下,电视的刷新过程。

这个模块是比较简单的,没有复杂的图像处理功能,但是这里还是必须把下面几个概念搞明白:

1>行同步(水平同步),行宽,前肩,后肩。

2>列同步(垂直同步),场宽

3>回扫

4>像素

5>rgb

6>灰阶

7>wishbone的burst访问

8>双buffer工作机制

9>alpha blanking

10>fifo的underrun和overrun

11>调色板的本质作用



4,仿真的整体结构

要想对vga_eng_top这个模块进行仿真,需要建立必要的仿真模型,并将它们连接起来。



5,仿真过程概述

1>复位

2>测试寄存器的读写是否有问题(reg_test)

3>初始化mem。

4>测试vga所有模式下的输出时序是否正确(tim_test),共6个模式。

5>测试DVI pixel数据的正确性:dvi_pd_test

6>测试VGA pixel的数据的正确性:pd1_test

7>测试FIFO的underrun:ur_test


6,各个模式下参数的设置:


for(mode=0;mode<6;mode=mode+1)
   begin
	
	// reset core
	scen = 0;
	m0.wb_wr1( `CTRL,  4'hf, 32'h0000_0000);
	repeat(10)	@(posedge clk);

	$display("Mode: %0d", mode);

	case(mode)
		0:
		begin
			thsync = 0;
			thgdel = 0;
			thgate = 319; // gate = 320
			thlen = 345;

			tvsync = 0;
			tvgdel = 0;
			tvgate = 239; // vgate = 240
			tvlen = 245;

			hpol = 0;
			vpol = 0;
			cpol = 0;
			bpol = 0;
		end

		1:
		begin
			thsync = 18;
			thgdel = 18;
			thgate = 319; // gate = 320
			thlen = 390;

			tvsync = 18;
			tvgdel = 18;
			tvgate = 239; // vgate = 240
			tvlen = 290;

			hpol = 1;
			vpol = 0;
			cpol = 0;
			bpol = 0;
		end

		2:
		begin
			thsync = 1;
			thgdel = 1;
			thgate = 639; // hgate = 640
			thlen = 644;

			tvsync = 1;
			tvgdel = 1;
			tvgate = 479; // vgate = 480
			tvlen = 484;

			hpol = 0;
			vpol = 1;
			cpol = 0;
			bpol = 0;
		end

		3:
		begin
			thsync = 0;
			thgdel = 2;
			thgate = 799; // hgate = 800
			thlen = 804;

			tvsync = 0;
			tvgdel = 2;
			tvgate = 599; // vgate = 600
			tvlen = 604;

			hpol = 0;
			vpol = 0;
			cpol = 1;
			bpol = 0;
		end

		4:
		begin
			thsync = 3;
			thgdel = 2;
			thgate = 799; // hgate = 800
			thlen = 807;

			tvsync = 2;
			tvgdel = 2;
			tvgate = 599; // vgate = 600
			tvlen = 606;

			hpol = 0;
			vpol = 0;
			cpol = 0;
			bpol = 1;
		end

		5:
		begin
			thsync = 6;
			thgdel = 2;
			thgate = 799; // hgate = 800
			thlen = 810;

			tvsync = 4;
			tvgdel = 2;
			tvgate = 599; // vgate = 600
			tvlen = 608;

			hpol = 1;
			vpol = 1;
			cpol = 1;
			bpol = 1;
		end
	endcase

/*
	thsync = 0;
	thgdel = 0;
	thgate = 64;
	thlen = 70;

	tvsync = 0;
	tvgdel = 0;
	tvgate = 64;
	tvlen = 70;

	hpol = 0;
	vpol = 0;
	cpol = 0;
	bpol = 0;
*/


	m0.wb_wr1( `HTIM,  4'hf, {thsync, thgdel, thgate} );
	m0.wb_wr1( `VTIM,  4'hf, {tvsync, tvgdel, tvgate} );
	m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
	m0.wb_wr1( `CTRL,  4'hf, {
				16'h0,
				bpol, cpol,
				vpol, hpol,
				1'b0,	// PC
				2'h0,	// CD
				2'h0,	// VBL
				2'h0,	// Reserved
				5'h01	// Bank Switch, INT, VideoEn
				});

	repeat(2) @(posedge vsync);
	scen = 1;
	repeat(4) @(posedge vsync);
   end



7,仿真结果

说明:仿真过程需要很长时间(我的电脑超过30mins),所以只选取了一行数据的输出波形,如下;

可以看到行同步型号,混合同步信号,blank信号,rgb信号等重要的几个信号的时序关系。



8,小结

剩下的工作就是FPGA验证了,参考之前的blog内容,将其挂在arbiter_dbus上面。

与之前那个FFT模块的接口一样,也是一个slave接口,和一个master接口。

http://blog.csdn.net/rill_zhen/article/details/8849149


附:

本实验的所有源码和文档我已上传:

http://download.csdn.net/detail/rill_zhen/5353755

good luck!


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Contents 1 VGA时序以及如何产生 3 1.1 VGA接口............................. 3 1.2 VGA驱动原理........................... 4 1.3 时序产生以及颜色给定...................... 4 1.3.1 行同步信号以及场同步信号怎么给........... 4 1.3.2 屏幕上的每个像素点是如何给定颜色的......... 6 2 字模提取 9 2.1 使用PCtoLCD2002提取字模................... 9 2.2 mif文件格式............................ 9 2.3 用C代码把从PCtoLCD软件得到的数据转换成mif文件 .... 10 3 VGAIPCore设计 11 3.1 屏幕上的像素以及字符...................... 11 3.2 显示字符的原理.......................... 12 3.3 实现向上卷动显示........................ 14 3.4 遇到换行怎么办.......................... 16 3.4.1 简单的处理办法(不完美)................ 16 3.4.2 更加完美的换行处理................... 17 3.5 如何使用这个VGAIPCore................... 17 4 UART模块 19 4.1 系统时钟、波特率........................ 19 4.2 如何通过UART发送数据..................... 19 4.3 采样时钟的概念以及如何通过UART接受数据......... 20 4.4 如何产生采样时钟........................ 20 4.5 还缺什么 ............................. 22 1 CONTENTS 2 5 未来要做什么 23 5.1 一个完美的VGAIPCore .................... 23 5.2 我的数字设计水平........................ 23 5.3 所以,未来还有很长的路...................... 23 A生成mif文件的C代码 24 B效果图 26
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值