lcytms
发表于 2017-2-14 11:42:50
本帖最后由 lcytms 于 2017-2-14 11:44 编辑
进行分析综合检查。
编写Testbench。
新建top_tb.v文件。
`timescale 1ns/1ps
module top_tb;
reg clk, rst_n;
wire r, g;
wire b;
wire hsync, vsync;
top dut(.clk(clk), .rst_n(rst_n), .r(r), .g(g), .b(b), .hsync(hsync), .vsync(vsync));
initial begin
clk = 1;
rst_n = 0;
#200.1
rst_n = 1;
#800_000 $stop;
end
always #10 clk = ~clk;
endmodule
lcytms
发表于 2017-2-14 11:46:37
进行分析综合检查。
进行仿真设置。
查看仿真结果。
先看行同步信号。
从复位完成开始时,行同步脉冲每经过1056个VGA时钟信号(40MHz)输出一次。
再看帧同步信号。
从复位完成开始时,经过4个行周期的帧同步脉冲之后,再经过23个行周期的显示后沿阶段,进入显示有效的阶段。
此时,RGB输出8’b111_000_00,对应红色输出。
时间间隔满足设计要求。
仿真功能正确。
lcytms
发表于 2017-2-14 11:52:15
参照.tcl文件设置好FPGA管脚
参照EP4CE6E22C8N.tcl文件内容,对FPGA芯片管脚进行设置。
EP4CE6E22C8N.tcl文件相关内容如下所示。
FPGA芯片配置结果如图所示。
#set_global_assignment -name FAMILY "Cyclone IV"
#set_global_assignment -name DEVICE ep4ce10f17c8n
set_location_assignment PIN_E1 -to clk
# KEY 轻触按键
set_location_assignment PIN_L3 -to key
# 256色VGA
set_location_assignment PIN_A7 -tovga_vs
set_location_assignment PIN_A6 -tovga_hs
set_location_assignment PIN_C6 -tovga_b
set_location_assignment PIN_B5 -tovga_b
set_location_assignment PIN_E5 -tovga_g
set_location_assignment PIN_A4 -tovga_g
set_location_assignment PIN_D4 -tovga_g
set_location_assignment PIN_C3 -tovga_r
set_location_assignment PIN_B1 -tovga_r
set_location_assignment PIN_E8 -tovga_r
lcytms
发表于 2017-2-14 11:54:21
.sof文件下载到FPGA
全编译FPGA工程,生成.sof文件,连接至芯ZX_1开发板并上电。
打开Programmer通过Jtag口,将.sof文件下载到FPGA进行在线仿真。
.sof文件下载界面如下图所示。
lcytms
发表于 2017-2-14 11:55:30
开发板运行效果(显示纯色)
开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。
屏幕显示纯色(红色)。
功能验证正确。
lcytms
发表于 2017-2-14 11:56:18
修改VGA驱动逻辑模块vga.v。
使之显示红绿蓝三色彩条。屏幕三等分,从上至下依次显示红、绿、蓝。
修改vga.v(显示彩条)文件如下。
module vga(clk, rst_n, rgb8, hsync, vsync);
input clk, rst_n;
output rgb8;
output hsync, vsync;
reg hcnt, vcnt;
wire hflag, vflag;
///// 800*600*60 40.0MHz = 1056(128+88+800+40) * 628(4+23+600+1) * 60Hz
parameter ha = 128,
hb = 88,
hc = 800,
hd = 40,
he = 1056;
parameter va = 4,
vb = 23,
vc = 600,
vd = 1,
ve = 628;
localparam hab = ha + hb,
hac = ha + hb + hc;
localparam vab = va + vb,
vac = va + vb + vc;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
hcnt <= 0;
vcnt <= 0;
end
else
begin
if ((vcnt == ve - 1) && (hcnt == he - 1))
begin
hcnt <= 0;
vcnt <= 0;
end
else
begin
if (hcnt == he - 1)
begin
hcnt <= 0;
vcnt <= vcnt + 1;
end
else
hcnt <= hcnt + 1;
end
end
end
assign hsync = (hcnt < ha) ? 1'b0 : 1'b1;
assign vsync = (vcnt < va) ? 1'b0 : 1'b1;
assign hflag = ((hcnt >= hab) && (hcnt < hac)) ? 1'b1 : 1'b0;
assign vflag = ((vcnt >= vab) && (vcnt < vac)) ? 1'b1 : 1'b0;
wire block;
// assign block = 8'b111_000_00;
assign block = (vcnt-vab<200) ? 8'b111_000_00 : (vcnt-vab<400) ? 8'b000_111_00 : 8'b000_000_11;
assign rgb8 = (hflag && vflag) ? block : 8'b000_000_00;
endmodule
lcytms
发表于 2017-2-14 11:57:39
开发板运行效果(显示彩条)
重新全编译,并下载程序。
开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。
屏幕显示彩条(由上至下,红绿蓝三等分彩条)。
功能验证正确。
lcytms
发表于 2017-2-14 11:57:59
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了VGA显示图像的基本原理,并对VGA驱动逻辑电路进行了建模和仿真,结合第十四讲的pll一起编写了一个完整的演示逻辑,进行了下板检查。
希望大家掌握VGA显示图像的基本原理,并熟练运用Verilog语言编写相关驱动逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。
课程到此结束,谢谢大家的关注!
bluesky
发表于 2017-2-20 08:51:31
:D:D:D:D:D:D继续关注
小舍YZ
发表于 2017-2-20 15:16:44
很详细,谢谢分享:)