实验6VGA彩条图像.docx
《实验6VGA彩条图像.docx》由会员分享,可在线阅读,更多相关《实验6VGA彩条图像.docx(14页珍藏版)》请在冰豆网上搜索。
![实验6VGA彩条图像.docx](https://file1.bdocx.com/fileroot1/2023-2/11/f11cfbc0-a677-4516-ab4f-41e81574763f/f11cfbc0-a677-4516-ab4f-41e81574763f1.gif)
实验6VGA彩条图像
实验6VGA彩条图像
一、实验目的
1.掌握VGA显示器与DE2-70连接方法;
2.了解VGA显示控制;
3.利用VGA显示高性能彩条测试图像。
二、硬件设计说明
DE2-70多媒体开发板的VGA输出支持30bits高性能图像输出,在此,设计一个基于AvalonST总线的高性能彩条测试图像发生器。
图6-1
硬件的结构如图6-1所示,利用“TestPatternGenerator”和“ClockedVideoOutput”这两个IP核完成VGA彩条图像的输出。
三、实验步骤
(一)硬件初建:
新建“demo_vga”工程
图6-2
鼠标左键双击桌面上的“QuartusII”快捷方式图标,耐心等待片刻,即可启动“QuartusII”设计页面,如图6-2所示。
在“QuartusII”设计页面内,鼠标左键单击“File‐>NewProjectWizard”。
弹出“NewProjectWizard:
introduction”,如图6-3所示。
图6-3
鼠标左键单击图6-3所示页面的“next”按钮跳过此页,进入“NewProjectWizard:
Directory,Name,Top-levelentity”页面。
在“NewProjectWizard:
Directory,Name,Top-levelentity”页面:
“theworkingdirectoryforthisproject”(工程路径)可以任意填写,例如:
“E:
/demo/demo_VGAcolpattern”。
“thenameofthisproject”(工程名字)填为“demo_vga”。
图6-4
“thenameofthetop-leveldesignentityforthisproject”(工程顶层实体名称)会自动与工程名字相同,也为“demo_vga”,如图6-4所示。
这里需要注意:
编写顶层文件时注意这个名字。
图6-5
鼠标左键单击“next”按钮,弹出图6-5所示的问句。
图6-6
鼠标左键单击“是”按钮,进入“AddFiles[page2of5]”页,如图6-6所示。
由于实验到这里还没有建立任何档案。
再加上后面步骤中也可以添加,故鼠标左键单击“Next”按钮跳过此页,进入“Family&DeviceSettings[page3of5]”页。
在“Family&DeviceSettings[page3of5]”页面:
“Devicefamily”栏里的“family”选择“CycloneII”。
“Availabledevices”栏里选择“EP2C70F896C6”器件,其它为缺省设置。
图6-7
如图6-7所示。
鼠标左键单击“next”按钮的话,还会出现第4页EDA工具的设置和第5页的“Summary”,如果用到可以在此设置。
由于目前没有用到,所以在这里就可以用鼠标左键单击“Finish”按钮,完成新工程的初建。
新建的“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面如图6-8所示。
图6-8
在“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面内“ProjectNavigator”(工程导航)下面的“entity”栏里,可以看到“CycloneII:
EP2C70F896C6”,和基于“CycloneII:
EP2C70F896C6”芯片的工程“demo_vga”。
图6-9
这里需要注意:
工程初建过程牵涉到几个方面,过程中的步骤没有先后之分。
例如,完成“QuartusII”工程的初建后,如果发现“entity”栏里不是“CycloneII:
EP2C70F896C6”,如图6-9所示。
鼠标左键双击“StratixII:
AUTO”,或者箭头指着“StratixII:
AUTO”然后鼠标单击右键,在下拉菜单里点击“settings”,两种方法都能使“Settings-demo_vga”的设置页弹出,在“Device”中,可以重新设置成如前面的图6-7所示。
初建的“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面,会自动保存在路径“E:
\demo\demo_VGAcolpattern”下。
如果想要再次打开此工程页面,可以再次打开此路径下的工程文件夹“demo_VGAcolpattern”,如图6-10所示。
图6-10
鼠标左键双击带有蓝色“Quartus”图标的“demo_vga”文件,就可以打开“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面。
(二)利用“SOPCBuilder”工具产生新硬件系统
配置硬件是个繁琐的事情,如果一个硬件参数配置不对,整个系统就不能用,所以简便而实用的方法是从友晶科技的大师们提供的范例里拷贝硬件配置,另外还可以从已经做通的实验里拷贝硬件配置。
在“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面,鼠标左键单击“open”按钮,弹出“打开”对话框。
在“查找范围”选择某个已经做通的实验所在的路径,把路径下的“nios0.sopc”文件拷贝到此实验所在的路径“E:
/demo/demo_VGAcolpattern”下。
鼠标左键双击“nios0.sopc”文件,打开后可以重新配置硬件。
有些在此实验需要的硬件可以保留,有些用不到的硬件可以一个个删除:
鼠标左键单击硬件名称使其蓝色高亮,然后单击硬件默认显示栏下的“Remove”按钮,即可删去此硬件。
在此,作为参考再次把此实验所需硬件完整配置一遍。
虽然此实验会用到VGA显示器,但是此处不需要VGA_Controller,因此不需要拷贝VGA_Controller的ip核,直接建立硬件系统。
在初建的“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面内,鼠标左键单击“Tools‐>SOPCBuilder”,弹出“CreateNewSystem”对话框,如图6-11所示。
图6-11
在“CreateNewSystem”对话框里:
“SystemName”项后输入“nios0”。
这里需要注意:
编写顶层文件例化“nios0”系统时,要审视顶层文件中“SystemName”是否是“nios0”。
图6-12
“TargetHDL”项一般选择“Verilog”。
鼠标左键单击“OK”按钮,即初步建成工程的“SOPCBuilder”工具页面,如图6-12所示。
在“SOPCBuilder”工具页面里可以添加实现此工程所需硬件,形成良好的硬件系统。
添加的硬件会在默认空白区出现,并且可以修改、删除,在默认空白区还显示硬件的连接。
图6-13
选择Verilog,表示“SOPCBuilder”会将你稍后所配置的IP,以Verilog表示,若你熟悉VHDL,也可以选择VHDL。
这里的设定不是限制了日后只能用Verilog或VHDL写代码,因为QuartusII本来就允许Verilog与VHDL混合編程,也就是说Verilog的module可以使用VHDL的entity,VHDL的entity可以使用Verilog的module,最后都能顺利编译。
这里需要注意:
如果配置硬件的过程中暂停设计,关闭“SOPCBuilder”工具页面会弹出一个问句,如图6-13所示。
鼠标左键单击“Save”按钮,建立的硬件信息就保存到路径“E:
/demo/demo_VGAcolpattern”下的“nios0.sopc”文件中。
如果需要再次打开此工程的“SOPCBuilder”工具页面完成后续的硬件配置的话,可以先打开“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面(方法如图6-10所示),在工程页面内,鼠标左键单击“open”按钮弹出“打开”页面。
在“查找范围”找到路径“E:
\demo\demo_VGAcolpattern”下的“nios0.sopc”文件,鼠标左键双击“nios0.sopc”文件,即可打开本工程的“SOPCBuilder”工具页面。
(三)配置硬件
1.定义时钟
确认“SOPCBuilder”工具页面的“Target/DeviceFamily”是“CycloneII”。
在如图6-14所示的“ClockSettings”栏里可以看到50.0MHz,代表NiosIICPU在DE2-70可以运行在50.0MHz,但这时CPU降频在跑,正常情況下,NiosIICPU在DE2-70可以运行100.0MHz,所以可以用PLL将clk倍频成100.0Mhz。
图6-14
2.增加用来保存Nios程序的片上存储器(OnChipMemory(RAMorROM))
“OnChipMemory”在FPGA芯片内,是DE2-70上所有存储器中存储量最小,但是速度最快的存储器。
图6-15
在“SOPCBuilder”工具页面,鼠标左键单击SystemContents->ComponentLibrary->MemoriesandMemoryControllers->OnChip->OnChipMemory(RAMorROM)->Add。
弹出“onchipmemory”设置页面,如图6-15所示。
在“onchipmemory”设置页面:
“TotalMemorySize”设置为80960;其他为缺省设置,鼠标左键单击“Finish”按钮。
不用管状态框里的错误,添加Nios处理器后会自动消失。
“Totalmemorysize”与能使用的M4K存储器数量、FPGA、NiosIICPU和Megafunction(如fcfifo)都会影响“On-chipMemory”的size,本教程使用80k。
“OnChipMemory”会在“SOPCBuilder”工具页面默认空白区有显示如图6-16所示。
如果想修改“OnChipMemory”的设置,可以左键双击硬件名称,会重新弹出如图6-15所示的设置页面。
对于其他硬件来说,方法类似。
图6-16
把“onchip_memory2_0”改成“onchip_mem”。
图6-17
3.添加NiosII处理器(NiosIIProcessor)
在“SOPCBuilder”工具页面,鼠标左键单击SystemContents->ComponentLibrary->NiosIIProcessor->Add,弹出“NiosIIProcessor”设置页面。
在“NiosIIProcessor”设置页面:
CPU设置为NiosII/f处理器;
ResetVector指向on-chipmemory;
ExceptionVector指向on-chipmemory。
如图6-17所示。
鼠标左键单击“Finish”按钮,把“cpu_0”改成“cpu”。
4.添加调试接口(JTAG-UART)
在“SOPCBuilder”工具页面,鼠标左键单击SystemContents->ComponentLibrary->InterfaceProtocols->Serial->JTAGUART->Add,弹出“JTAGUART”设置页,如图6-18所示。
使用缺省设置,鼠标左键单击“Finish”按钮。
把“jtag_uart_0”改成“jtag_uart”。
图6-18
JTAGUART是PC与SOPC进行序列传输的一种方式,也是NiosIICPU标准的输出/输入设备。
如printf()通过JTAGUART,经过USBBlaster将输出结果显示在PC的NiosIIEDS上的console,scanf()通过USBBlaster经过JTAGUART将输入传给SOPC。
5.添加两个内部定时器(IntervalTimer)
图6-19
在“SOPCBuilder”工具页面,鼠标左键单击SystemContents->ComponentLibrary->Peripherals->MicrocontrollerPeripherals->IntervalTimer->Add,弹出“IntervalTimer”设置页,按照图6-19所示设置,鼠标左键单击“Finish”按钮。
把“timer_0”改成“timer”。
6.添加系统ID(SystemID)
图6-20
在“SOPCBuilder”工程页面,鼠标左键单击SystemContents->ComponentLibrary->Peripherals->DebugandPerformance->SystemIDPeripheral->Add,弹出“SystemIDperipheral”设置页面,如图6-20所示。
使用缺省设置,鼠标左键单击“Finish”按钮,把“sysid_0”的名称改为“sysid”。
“SOPCBuilder”会使用SystemID为每个系统提供识别符号,NiosIIEDS可以识别符号防止使用者往FPGA上烧录了与“.ptf”不符合的“.sof”。
7.增加PLL
本实验需要一个25MHz的时钟用做VGAClock。
图6-21
在“SOPCBuilder”工具页面,鼠标左键单击SystemContents->ComponentLibrary->PLL->PLL->Add。
在弹出的对话框里,鼠标左键单击“LaunchAltera’sALTPLLMegaWizard”,使按钮周框内侧出现虚方框,如图6-21所示。
鼠标左键单击“next”按钮,进入ALTPLL多项设置页面。
默认进入的页面是:
1parametersettings栏的“General/Modes”设置页,显示为:
1parametersettings为深兰色背景,“General/Modes”为General/Modes,如图6-22左上角所示,此页缺省设置。
图6-22
图6-23
鼠标左键单击2outputclocks栏,默认转换到“c0-Core/Externaloutputclocks”的设置页面,在“c0-Core/Externaloutputclocks”的设置页面:
2outputclocks为深兰色背景,“clkc0”为clkc0,“clkc0”各参数按照图6-23所示页面设置。
鼠标左键单击“Finish”按钮,并且单击经过的所有页面的“Finish”按钮。
设置了PLL后,在本工程硬件系统的“SOPCBuilder”工具页面,“ClockSettings”栏下:
“clk_0”改名为“clk_50”;
“pll_0_c0”改名为“clk_25”;
如图6-24所示。
图6-24
8.增加TestPatternGenerator
图6-25
在“SOPCBuilder”工具页面中,鼠标左键单击SystemContents‐>ComponentLibrary‐>VideoandImageProcessing‐>TestPatternGenerator‐>Add,弹出“TestPatternGenerator”设置页面。
在“TestPatternGenerator”设置页面,严格按照图6-25设置参数,然后鼠标左键单击“Finish”按钮,在“SOPCBuilder”工具页面下部有错误提示,先不要理它,将该硬件的名称改为“tpg”。
图6-26
9.增加ClockedVideoOutput
在“SOPCBuilder”工具页面中,鼠标左键单击SystemContents‐>ComponentLibrary‐>VideoandImageProcessing‐>IO‐>ClockedVideoOutput‐>Add。
弹出“ClockedVideoOutput”设置页面。
在“ClockedVideoOutput”设置页面,严格按照图6-26所示设置参数,将该硬件的名称改为“vga”。
图6-27
此时,出现如图6-27左图所示情况,需要手动将“tpg”与“vga”连接起来。
将光标移至器件左端,出现中图所示情况,鼠标左键单击小白点,使其变成黑点,移开光标可以看到“tpg”与“vga”连接起来,如右图所示。
到此已经完成了“nios0”硬件系统的搭建,结构如图6-28所示。
图6-28
(四)产生“.ptf”文件
在“SOPCBuilder”工具页面,鼠标左键单击System‐>Auto‐AssignBaseAddresses,菜单自动设置映射地址;
在“SOPCBuilder”工具页面,鼠标左键单击System‐>Auto‐AssignIRQs菜单自动设置中断号,中断号越小,优先级越高。
一般把Timer的优先级设为最高。
图6-29
鼠标左键单击“Generate”按钮。
如果弹出问句,鼠标左键单击“Save”按钮。
“Generate”过程中,弹出的“GeneratingSystem”页面显示有进度提示,如图6-29所示。
当进度提示出现“info:
systemgenerationwassuccessful”时“Generate”完成,“Generate”完成后,鼠标左键单击“Exit”按钮。
如果弹出是否保存的问句,也用鼠标左键单击“Save”按钮。
这里需要注意:
“.ptf”文件与“Generate”完成后生成的其他文件都自动保存在路径“E:
/demo/demo_VGAcolpattern”下。
(五)编写顶层文件
“SOPCBuilder”工具已经产生了“nios0”硬件系统,下面要在“QuartusII”里例化“nios0”,并且把“nios0”硬件系统与其他的逻辑电路、芯片的输入输出管腿连接。
例化“nios0”硬件系统可以用原理图方法,或者用“Verilog”语言编写顶层文件。
在此,采用“VerilogHDL”语言来编写顶层文件例化“nios0”硬件系统。
图6-30
在“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面,鼠标左键单击File‐>New,弹出“New”框。
鼠标左键双击“VerilogHDLFile”,打开“.v”文件录入区,如图6-30所示录入框中可以看到一条垂直的闪烁录入光标的文件录入区。
就像平时使用word文档时一样,把下面篇幅中提供的“demo_vga.v”内容(注意只拷贝冒号后面的内容)拷贝进去。
demo_vga.v”内容如下:
moduledemo_vga(
inputiCLK_50,//50MHz
output[9:
0]oVGA_B,
output[9:
0]oVGA_G,
output[9:
0]oVGA_R,
outputoVGA_CLOCK,
outputoVGA_BLANK_N,
outputoVGA_SYNC_N,
outputoVGA_HS,
outputoVGA_VS
);
wireclk_25;
wirevid_h,vid_v,vid_h_sync,vid_v_sync;
assignoVGA_CLOCK=clk_25;
assignoVGA_SYNC_N=0;
assignoVGA_BLANK_N=~(vid_v|vid_h);
assignoVGA_HS=~vid_h_sync;
assignoVGA_VS=~vid_v_sync;
nios0nios0_inst
(
//globalsignals
.clk_50(iCLK_50),//50MHz
.clk_25(clk_25),//vgaclock
.reset_n(1'b1),//CPUReset
.vid_clk_to_the_vga(clk_25),
.vid_data_from_the_vga({oVGA_R,oVGA_G,oVGA_B}),
.vid_h_from_the_vga(vid_h),
.vid_v_from_the_vga(vid_v),
.vid_h_sync_from_the_vga(vid_h_sync),
.vid_v_sync_from_the_vga(vid_v_sync)
);
endmodule
介绍顶层文件中部分代码完成的功能:
“clk_25”输出端是“nios0”系统内部的锁相环元件的25MHz时钟输出,连接到“nios0”的“vid_clk_to_the_vga”输入端(“ClockedVideoOutput”元件的视频时钟输入端,作为VGA扫描时序产生电路的时钟)。
“ClockedVideoOutput”产生的行、场同步信号“vid_h_sync”,“vid_v_sync”与VGA需要的同步信号极性相反,所以需要反相后再输出:
assignoVGA_HS=~vid_h_sync;
assignoVGA_VS=~vid_v_sync;
产生ADV7123的25MHz时钟输入:
assignoVGA_CLOCK=clk_25;
产生ADV7123的同步信号输入(低电平有效,固定为低):
assignoVGA_SYNC_N=0;
产生ADV7123的消隐信号输入(低电平有效),“ClockedVideoOutput”的“vid_h”,“vid_v”是高电平有效,将这两个信号相或后反相即可:
assignoVGA_BLANK_N=~(vid_v|vid_h);
(六)分配管腿
图6-31
由于每个实验都是用DE2-70多媒体开发板,故所用的“.tcl”文件都是一样的。
把路径“D:
\SOPC实验资料\VGAcolpattern资料”下的“pins‐de2‐70.tcl”文件拷贝到此实验路径“E:
\demo\demo_VGAcolpattern”下。
然后,在“QuartusII-E:
/demo/demo_VGAcolpattern/demo_vga-demo_vga”工程页面中,鼠标左键单击Tools‐>TCLScripts…菜单,弹出“TclScripts”对话框,如图6-31所示。
鼠标左键单击“pins‐de2‐70.tcl”使其高亮,然后鼠标左键单击“Run”按钮,稍等片刻即可以完成管腿分配。
(七)硬件编译
图6-32