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

很详细,谢谢分享:)
页: 1 2 [3] 4
查看完整版本: FPGA初级课程第二十四讲 VGA(显示纯色、彩条)