今天看了本《系统晶片设计-使用NIOS》这本书,看到VGA IP核的设计不错,特移植到Cyclone III上来,试验一下效果。

顶层代码:binary_VGA.v

 module    binary_VGA (    iDATA,    oDATA,    iADDR,iWR,
iRD, iCS, iRST_N, iCLK,
VGA_R, VGA_G, VGA_B,
VGA_HS, VGA_VS, VGA_SYNC,
VGA_BLANK, VGA_CLK ); output [:] oDATA;
input [:] iDATA;
input [:] iADDR;
input iWR,iRD,iCS;
input iCLK,iRST_N; output [:] VGA_R;
output [:] VGA_G;
output [:] VGA_B;
output VGA_HS;
output VGA_VS;
output VGA_SYNC;
output VGA_BLANK;
output VGA_CLK; wire iCLK_25;
reg [:] RGB_EN;
reg [:] oDATA;
wire [:] mVGA_ADDR;
reg [:] oRed;
reg [:] oGreen;
reg [:] oBlue;
parameter RAM_SIZE = 'h4B000; always@(posedge iCLK or negedge iRST_N)
begin
if(!iRST_N)
begin
RGB_EN <= ;
oDATA <= ;
end
else
begin
if(iCS)
begin
if(iWR)
begin
case(iADDR)
RAM_SIZE+ : RGB_EN <= iDATA[:];
endcase
end
else if(iRD)
begin
case(iADDR)
RAM_SIZE+ : oDATA <= RGB_EN ;
endcase
end
end
end
end ram_binary_VGA u1 ( // Write In Side
.data(iDATA[:]),
.wren(iWR && (iADDR < RAM_SIZE) && iCS),
.wraddress({iADDR[:],~iADDR[:]}),
.wrclock(iCLK),
// Read Out Side
.rdaddress(mVGA_ADDR[:]),
.rdclock(VGA_CLK),
.q(ROM_DATA)); tff t0(.clk(iCLK),.t('b1),.q(iCLK_25)); reg [:] ADDR_d;
reg [:] ADDR_dd;
wire [:] ROM_DATA; always@(posedge VGA_CLK or negedge iRST_N)
begin
if(!iRST_N)
begin
oRed <= ;
oGreen <= ;
oBlue <= ;
ADDR_d <= ;
ADDR_dd <= ;
end
else
begin
ADDR_d <= mVGA_ADDR[:];
ADDR_dd <= ~ADDR_d;
oRed <= ROM_DATA[ADDR_dd]? 'b1111111111:10'b00000000;
oGreen <= ROM_DATA[ADDR_dd]? 'b1111111111:10'b00000000;
oBlue <= ROM_DATA[ADDR_dd]? 'b1111111111:10'b00000000;
end
end VGA_ctr u0 ( // Host Side
.i_RGB_EN(RGB_EN),
.oAddress(mVGA_ADDR),
.iRed (oRed),
.iGreen (oGreen),
.iBlue (oBlue),
// VGA Side
.oVGA_R(VGA_R),
.oVGA_G(VGA_G),
.oVGA_B(VGA_B),
.oVGA_H_SYNC(VGA_HS),
.oVGA_V_SYNC(VGA_VS),
.oVGA_SYNC(VGA_SYNC),
.oVGA_BLANK(VGA_BLANK),
.oVGA_CLOCK(VGA_CLK),
// Control Signal
.iCLK_25(iCLK_25),
.iRST_N(iRST_N) ); endmodule

binary_VGA

VGA_ctl.v 如下:

 module    VGA_ctr(i_RGB_EN,iRed,iGreen,iBlue,
oVGA_R,oVGA_G,oVGA_B,oVGA_H_SYNC,
oVGA_V_SYNC,oVGA_SYNC,oVGA_BLANK,oVGA_CLOCK,
iCLK_25, iRST_N, oAddress); input iCLK_25;
input iRST_N;
input [:] i_RGB_EN;
input [:] iRed,iGreen,iBlue; output [:] oAddress; output [:] oVGA_R,oVGA_G,oVGA_B;
output oVGA_H_SYNC,oVGA_V_SYNC;
output oVGA_SYNC;
output oVGA_BLANK;
output oVGA_CLOCK; // H_Sync Generator, Ref. 25 MHz Clock
parameter H_SYNC_CYC = ;
parameter H_SYNC_TOTAL= ; reg [:] H_Cont;
reg oVGA_H_SYNC;
always@(posedge iCLK_25 or negedge iRST_N)
begin
if(!iRST_N)
begin
H_Cont <= ;
oVGA_H_SYNC <= ;
end
else
begin
// H_Sync Counter
if( H_Cont < H_SYNC_TOTAL) //H_SYNC_TOTAL=800
H_Cont <= H_Cont+;
else
H_Cont <= ;
// H_Sync Generator
if( H_Cont < H_SYNC_CYC ) //H_SYNC_CYC =96
oVGA_H_SYNC <= ;
else
oVGA_H_SYNC <= ;
end
end parameter V_SYNC_TOTAL= ;
parameter V_SYNC_CYC = ;
reg [:] V_Cont;
reg oVGA_V_SYNC; // V_Sync Generator, Ref. H_Sync
always@(posedge iCLK_25 or negedge iRST_N)
begin
if(!iRST_N)
begin
V_Cont <= ;
oVGA_V_SYNC <= ;
end
else
begin
// When H_Sync Re-start
if(H_Cont==)
begin
// V_Sync Counter
if( V_Cont < V_SYNC_TOTAL ) //V_SYNC_TOTAL =525
V_Cont <= V_Cont+;
else
V_Cont <= ;
// V_Sync Generator
if( V_Cont < V_SYNC_CYC ) // V_SYNC_CYC =2
oVGA_V_SYNC <= ;
else
oVGA_V_SYNC <= ;
end
end
end parameter H_SYNC_BACK = +;
parameter V_SYNC_BACK = +;
parameter X_START = H_SYNC_CYC+H_SYNC_BACK+;
parameter Y_START = V_SYNC_CYC+V_SYNC_BACK;
parameter H_SYNC_ACT = ;
parameter V_SYNC_ACT = ;
reg [:] oVGA_R,oVGA_G,oVGA_B;
always@(H_Cont or V_Cont or i_RGB_EN or iRed or
iGreen or iBlue )
begin
if(H_Cont>=X_START+ && H_Cont<X_START+H_SYNC_ACT+ &&
V_Cont>=Y_START && V_Cont<Y_START+V_SYNC_ACT)
begin
if (i_RGB_EN[]==)
oVGA_R=iRed ;
else
oVGA_R=;
if (i_RGB_EN[]==)
oVGA_G=iGreen ;
else
oVGA_G=;
if (i_RGB_EN[]==)
oVGA_B=iBlue ;
else
oVGA_B=;
end
else
begin
oVGA_R=;oVGA_G=;oVGA_B=;
end
end assign oVGA_BLANK = oVGA_H_SYNC & oVGA_V_SYNC;
assign oVGA_SYNC = 'b0;
assign oVGA_CLOCK = ~iCLK_25; reg [:] oCoord_X,oCoord_Y;
reg [:] oAddress;
always@(posedge iCLK_25 or negedge iRST_N)
begin
if(!iRST_N)
begin
oCoord_X <= ;
oCoord_Y <= ;
oAddress <= ;
end
else
begin
if( H_Cont>=X_START && H_Cont<X_START+H_SYNC_ACT &&
V_Cont>=Y_START && V_Cont<Y_START+V_SYNC_ACT )
begin
oCoord_X <= H_Cont-X_START;
oCoord_Y <= V_Cont-Y_START;
oAddress <= oCoord_Y*H_SYNC_ACT+oCoord_X-;
end
end
end endmodule // VGA Side // Internal Registers and Wires

VGA_tel

ram_binary_VGA的调用见下图:

关于VGA_init.mif的调用,

接下来选择View-Address Radix 选择Decimal;选择View-Memory Radix 选择Binary;选择视窗Edit--Custom Fill Cells,出现如下框图:

完后,添加IP核,

添加入进去IP核即可。注意:SOPC可以自动寻找IP核目录,只限于工程文件夹的子目录,如果在子目录中再添加目录,不可以寻找,必须在sopc中指定相应的目录。

VGAtest实验

pingpong兵乓球实验

  

VGA IP核的制作的更多相关文章

  1. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...

  2. 如何将自己写的verilog模块封装成IP核

    如何将自己写的verilog模块封装成IP核 (2014-11-21 14:53:29) 转载▼ 标签: 财经 分类: 我的东东 =======================第一篇========= ...

  3. 使用matlab和ISE 创建并仿真ROM IP核

    前言 本人想使用简单的中值滤波进行verilog相关算法的硬件实现,由于HDL设计软件不能直接处理图像,大部分过程都是可以将图像按照一定的顺序保存到TXT文档中,经过Modelsim仿真后,处理的数据 ...

  4. Vivado使用技巧(二):封装自己设计的IP核

    由 judyzhong 于 星期五, 09/08/2017 - 14:58 发表 概述   Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原 ...

  5. Vivado使用技巧:封装自己设计的IP核

    概述   Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原理图设计的方式,只需要在其中调用设计好的IP核连线.IP核一部分来自于Xilinx ...

  6. 调用altera IP核的仿真流程—下

    调用altera IP核的仿真流程—下 编译 在 WorkSpace 窗口的 counter_tst.v上点击右键,如果选择Compile selected 则编译选中的文件,Compile All是 ...

  7. 调用altera IP核的仿真流程—上

    调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的 ...

  8. (转)modelsim10.0C编译ISE14.7的xilinx库(xilinx ip核)

    原地址modelsim10.0C编译ISE14.7的xilinx库(xilinx ip核)   1.打开D:\Xilinx\14.7\ISE_DS\ISE\bin\nt64\compxlibgui.e ...

  9. Lattice 的 DDR IP核使用调试笔记之DDR 的 仿真

    —— 远航路上ing 整理于 博客园.转载请标明出处. 在上节建立完工程之后,要想明确DDR IP的使用细节,最好是做仿真.然后参考仿真来控制IP 核. 仿真的建立: 1.在IP核内的以下路径找到以下 ...

随机推荐

  1. ubuntu 13.04 xrdp 远程桌面连接问题[转载]

    本人ubuntu12.04,遇到了同样的问题,用一下方法解决了,mark一下. ubuntu 13.04 xrdp 远程桌面连接问题. win 7 远程桌面连接 ubuntu desktop 有几种办 ...

  2. Jquery全选与反选checkbox(代码示例)

    今天在公司要实现操作权限的功能,需要根据左边的树,选择一项,判断右边的操作权限,例如,增加,修改,删除,查看等按钮的显示与隐藏: 这个功能实现思路如下: 1.操作权限:增加.修改等按钮的ID和Text ...

  3. PLSQL常用时间函数

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. CSS 伪元素

    CSS伪元素是用来添加一些选择器的特殊效果. 语法 伪元素的语法: selector:pseudo-element {property:value;} CSS类也可以使用伪元素: selector.c ...

  5. javascript 学习笔记之面向对象编程(二):继承&多态

    ~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...

  6. Jquery常用功能

    jQuery 1.4给开发者带来了很多值得兴奋的新特性,同时使用jQuery的人也越来越多,为了方便大家对jQuery的使用,下面列出了一些jQuery使用技巧.比如有禁止右键点击.隐藏搜索文本框文字 ...

  7. Mac Pro的HDMI接口与WI-FI可能存在冲突的解决方法

    当我将Mac Pro通过HDMI->DVI转接头接上一台显示器时,正在使用的WI-FI网络立马不能使用,重新连接网络也不行,但断开HDMI连接后,WI-FI立马恢复正常. 在网上查,在apple ...

  8. 2016022603 - redis数据类型

    Redis支持5种类型的数据类型 1.字符串:Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限.[类 ...

  9. 【算法】一般冒泡排序 O(n^2) 稳定的 C语言

    冒泡排序 一.算法描述 假设序列中有N个元素: 第一趟选取第一个元素作为关键字,从左至右比较,若遇到比它小的则放到它左边(也即两数进行交换),若遇到比它大的,则改为选取该元素作为关键字完成后续的比较, ...

  10. io开发之C语言第二天

    开发环境是OS X系统下的Xcode Xcode的两个快捷键以及打开Xcode项目的正确方式 快捷键:command + B 编译 + 链接 快捷键:command + R 编译 + 链接 + 运行 ...