黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验

摘要:
黑金测试9——VGA VGA LCD的使用主要由五个信号控制HSYNC:列同步信号VSYNC:行同步信号RED:红色分量GREEN:绿色分量BLUE:蓝色分量VGA扫描是固定的。VGA从左到右逐行显示,如上图所示。事实上,这相当于一个HSYNC通信需要1056位数据,前128位在低电平同步,然后下128位逐段同步。剩下的是使用系统的CLK来构造满足我们需求的VGACLK,即下表中的时钟列。在这种情况下,VGA_SYNC模块。

最近这段时间忙着搬家,然后准备生产相关事情,各种杂事~

然后光棍节来,给自己和老爸老妈买点东西。。。

效率好低。。要检讨啊~ 不能找借口!

黑金的试验九 --VGA的用法

VGA 液晶显示

主要由5个信号控制

HSYNC : 列同步信号

VSYNC : 行同步信号

RED : 红分量

GREEN : 绿分量

BLUE : 蓝分量

VGA 的扫描是固定的。一帧的屏幕是由“m 行扫描”和“n 列填充”组成。假设以800
x 600 x 60Hz 为例的显示标准( 800 宽x 600 高x 60Hz ), 那么宏观上它有600 行
和800 列为一行。

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第1张

VGA 如上图 从左到右,逐行显示。

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第2张

作为新手,一开始不大明白。其实这个就是相当于HSYNC 一次通信需要1056位数据,然后前128是低电平做同步,然后后面一段一段的。真正有效地就是C Q 段 就是我们说的800X600

实现的时候,就只要找到最基本的单元,一个一个累加就好了

如上面显示的,最基本单元是HSYNC,列信号。列信号记满,然后行信号加一个。

剩下的就是用系统的CLK 构造一个满足我们要求的 VGA CLK ,即下面表中的时钟那栏。

如果正好,就可以直接用,系统clk 太低,就PLL倍频下,如果clk,通过计数,产生一个VGA_clk

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第3张

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第4张黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第5张

通过本次学习,了解了一个模块的基本构造,菜鸟理解如下,还请大师们多多指点:

<1> 需要搭建一个最基本的时钟模块,用以产生整个系统所需要的主时钟,本次采用的是ISE自带的IP核 clk_wizard 生成的

<2> 需要构建一个最基本的动作实现模块,用以实现最基本的动作。本例中即VGA_SYNC模块。告诉我们how to do 怎么做这个显示这个动作,应该就是常见的 时序

<3> 需要构建一个控制模块,用以实现最表象的东西,本例中即VGA_display_control模块,告诉我们 最终的表像,无论你的内容是什么,最终表现在外面的就只是GRB 3个东西

你要控制的就是什么时候显示怎么样子的GRB分量,其他的模块都是补充说明你要控制的时间、控制的内容

上面的三个是大树的主干,其他再怎么弄,都是一些枝枝叶叶罢了,你可以没有部分枝叶,但是不能没有大树

感觉还是有点怪异,不知道是不是这样说对不对,大致是这样的意思,目前的理解是这样的

在本次试验中需要学习的地方如下:

1> 构造基本时钟的手法

2> 在同步和控制2个模块之间,他通过一个使能信号,我用了 vga_vlddata_flag 来连接,只有控制模块时序基本目标,就给一个标志信号,告诉控制模块可以开始干嘛干嘛了

3> 眼花缭乱的 X ? y : z 语句 ,灵活运用, 比如vga_red_sig = ( vga_vlddata_flag && (你要显示的内容 ) ) ? 1'b1 : 1'b0 ;

通过简简单单的一个?语句就实现了在特定条件下 输出1或者0

4> 各种位操作,有待熟悉和提高,出现的最多的警告就是位操作引起的

5> 到目前为止,个人理解wire 和reg 声明如下:

一般在开头赋值 assign 内部wire变量声明 = 外部的input 脚 ,然后在always里面直接引用,初始化的时候不能对这个input 变量赋值

一般在结尾赋值 assign 最终输出的output = 内部reg 变量声明,在always里面使用内部变量,需要在初始化的时候赋值,不然会报错

不过不知道这么转一下有什么好处不,更加清楚么,请大神们指点下

6> 引用子模块的时候 用后面这个方式: vga_clk_module U91_vga_clk_generator();

子模块的文件名都加上_module 然后U91 9 表示顶层名字 1 表示9模块的1小模块 后面名字表示功能

然后后面计划准备用下面这个命名方式,待完善:

1. 最顶层连接外部器件的端口名字都加上 模块名_xxx_sig_o/模块名_xxx _sig_i 比如 vga_hsync_sig_o

2. 然后将他按照上面那个5> 条 赋给中间声明,w_模块名_xxx_sig 比如w_vga_hsync_sig // input from / output to 要注释上从哪里来 到哪里去

3. 然后子模块里面 端口用 模块名_xxx_sig 不带o i 比如vga_hsync_sig

4. 然后子模块如果需要,再赋给中间变量 r_xxx_sig 或者w_xxx_sig 比如 r_hsync_sig

暂时是这么想的,后面再看看,再改吧

然后还碰到个很奇怪的问题,有没有大神 帮忙看看啊,百度了下 还是不是很清楚,个人感觉应该还是位的问题

WARNING:Xst:2677 - Node <column_n_4> of sequential type is unconnected in block <vga_display_control_module>.

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第6张

这个每个单个文件综合的时候都完美无缺,没有任何错误,然后用顶层文件综合就出现这个Warning了

好像是说我中间变量没有连接上,好奇怪 不知道怎么搞,为什么一样声明的,就这三个报错,其他的不报错呢。。。求大神们指点~~

黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验第7张

然后代码如下:

1 moduleexam9_VGA_display_module(
2         
3     //System input
4 clk ,
5 rst_n ,
6     
7     //input
8     
9     //output
10     vga_vsync_display_o ,                            //Row sync sig output 
11     vga_hsync_display_o ,                        //Column sync sig output 
12     
13 vga_red_sig_o ,
14 vga_green_sig_o ,
15 vga_blue_sig_o 
16     
17 );
18 
19     
20     /***************  Port Declaration  ******************/
21     
22     //System input
23     inputclk ;
24     inputrst_n ;
25     
26     //input
27     
28     //output
29     
30     outputvga_hsync_display_o ;
31     outputvga_vsync_display_o ;
32     
33     outputvga_red_sig_o ;
34     outputvga_green_sig_o ;
35     outputvga_blue_sig_o ;
36     
37     /************  Port data type declaration  *************/
38     /****************  Define Parameter  *****************/
39     /***************  Internal Registers  *****************/
40     /******************  Internal Wire  ******************/
41     wirew_vga_clk_40MHz ;
42             
43     wirew_vga_hsync_sig ;
44     wirew_vga_vsync_sig ;
45     
46     wirew_vga_vlddata_flag ;
47     wire [10:0] w_vga_column_addr ;
48     wire [9:0]  w_vga_row_addr ;
49     
50     wire [5:0] w_vga_rom_addr ;
51     wire [63:0] w_vga_rom_data ;
52 
53     wirew_vga_red_sig ;
54     wirew_vga_green_sig ;
55     wirew_vga_blue_sig ;
56     
57     /****************  Code Starts Here  *****************/
58     //module IP core for generating the vga work clk
59 vga_clk_module U91_vga_clk_generator(
60 .CLK_IN1(clk) ,
61 .RESET(rst_n),
62 .CLK_OUT1(w_vga_clk_40MHz)
63 );
64     
65     
66     //module for how vga display
67 vga_sync_module U92_vga_sync(
68      
69         //System input
70 .vga_clk(w_vga_clk_40MHz),
71 .rst_n(rst_n),
72         
73         //input
74         
75         //output
76 .vga_hsync_sig(w_vga_hsync_sig),
77 .vga_vsync_sig(w_vga_vsync_sig),
78         
79 .vga_vlddata_flag(w_vga_vlddata_flag),
80 .vga_column_addr(w_vga_column_addr),
81 .vga_row_addr(w_vga_row_addr)
82     
83 );
84     
85 vga_rom_data_module U93_vga_rom_data (
86         
87         //System input 
88 .vga_clk(w_vga_clk_40MHz),
89 .rst_n(rst_n),
90         
91         //input
92 .vga_rom_addr(w_vga_rom_addr),        
93         
94         //output 
95 .vga_rom_data(w_vga_rom_data)
96         
97 );
98     
99     //module for what vga to display
100 vga_display_control_module U94_vga_display(
101     
102         //System input
103 .vga_clk(w_vga_clk_40MHz),
104 .rst_n(rst_n),
105         
106         //input
107 .vga_vlddata_flag(w_vga_vlddata_flag),
108         
109 .vga_column_addr(w_vga_column_addr),
110 .vga_row_addr(w_vga_row_addr),
111         
112         .vga_rom_data(w_vga_rom_data),            //input from U93 vga_rom
113         
114         //output
115         .vga_rom_addr(w_vga_rom_addr),            //output to U93 vga_rom
116         
117 .vga_red_sig(w_vga_red_sig),
118 .vga_green_sig(w_vga_green_sig),
119 .vga_blue_sig(w_vga_blue_sig)
120             
121 );
122         
123     /*****************************************************/
124     assign vga_hsync_display_o =w_vga_hsync_sig ;
125     assign vga_vsync_display_o =w_vga_vsync_sig ;
126     
127     assign vga_red_sig_o =w_vga_red_sig ;
128     assign vga_green_sig_o =w_vga_green_sig ; 
129     assign vga_blue_sig_o =w_vga_blue_sig ;
130     /*****************************************************/
131 
132 
133 endmodule
exam9_VGA_display_module
1 modulevga_sync_module(
2     
3     //System input
4 vga_clk,
5 rst_n,
6     
7     //input
8 
9     //output
10 vga_hsync_sig ,
11 vga_vsync_sig ,
12     
13 vga_vlddata_flag ,
14 vga_column_addr ,
15 vga_row_addr 
16     
17 );
18     
19     /***************  Port Declaration  ******************/
20     
21     //System input
22     input vga_clk ;               //clk input 40MHz
23     inputrst_n ;
24     
25     //input
26     
27     //output
28     outputvga_hsync_sig ;
29     outputvga_vsync_sig ;
30     
31     outputvga_vlddata_flag ;
32     output [10:0] vga_column_addr ;
33     output [9:0] vga_row_addr ;
34     
35     
36     /************  Port data type declaration  *************/
37     wirevga_hsync_sig ;
38     wirevga_vsync_sig ;
39     
40     wirevga_vlddata_flag ;
41     wire [10:0] vga_column_addr ;
42     wire [9:0] vga_row_addr ;
43     
44     /****************  Define Parameter  *****************/
45 
46     /***************  Internal Registers  *****************/
47     reg vga_count ;        //the basic count to get 800X600 clk 
48     regclk_800x600x60 ;
49     
50     reg [10:0] h_count ;            //the hsync count for column
51     reg [9:0] v_count ;            //the vsync count for row
52     reg r_vlddata_flag ;           //the flag for VGA display valid data ,like 800X600X60
53     
54     /******************  Internal Wire  ******************/
55 
56     /****************  Code Starts Here  *****************/
57     //to get the CLK 800X600X60 = 40MHz
58     //if the input clk is not 40MHz , you need to change the MAX vga_count to get it
59     always @ ( posedge vga_clk or negedgerst_n)
60         if ( !rst_n )
61             begin
62                     vga_count <= 1'b0 ;
63                     clk_800x600x60 <= 1'b0 ;
64             end
65         else if ( vga_count == 1'b1 )
66                 begin
67                         vga_count <= 1'b0 ;
68                         clk_800x600x60 <= ~clk_800x600x60  ;
69                 end
70         else 
71                 begin
72                         vga_count <= vga_count + 1'b1 ;
73                         clk_800x600x60 <= 1'b0 ;
74                 end
75                 
76     //vga HSYCN  count 128_88_800_40 =1056 for 800X600X60
77     always @ ( posedge clk_800x600x60 or negedgerst_n )
78         if ( !rst_n ) 
79             begin
80                     h_count <= 11'd0 ;
81             end
82         else if ( h_count == 11'd1056 ) 
83             begin
84                     h_count <= 11'd0 ;
85             end
86         else 
87             begin
88                     h_count <= h_count + 1'b1 ;
89             end
90             
91     //vga VSYNC  count 4_23_600_1 = 628 for 800X600X60
92     always @ ( posedge clk_800x600x60 or negedgerst_n )
93         if ( !rst_n ) 
94             begin
95                     v_count <= 10'd0;
96             end
97         else if ( v_count == 10'd628 ) 
98             begin
99                     v_count <= 10'd0 ;
100             end
101         else if ( h_count == 11'd1056 )
102             begin
103                     v_count <= v_count + 1'b1 ;
104             end
105             
106     //vga valid data flag 
107     //flag = 1 when [h_count between 216~1041 (800)] && [v_count between 27 ~ 627 (600)]
108     always @ ( posedge clk_800x600x60 or negedgerst_n )
109         if ( !rst_n ) 
110             begin
111                     r_vlddata_flag <= 1'b0 ;                    
112             end
113         else if ( ( h_count > 11'd216 && h_count < 11'd1041 ) && ( v_count > 11'd27 && v_count < 11'd627 ) )
114             begin
115                     r_vlddata_flag <= 1'b1 ;
116             end
117         else 
118             begin
119                     r_vlddata_flag <= 1'b0 ;
120             end
121             
122     /*****************************************************/
123     assign vga_hsync_sig = ( h_count < 11'd128 ) ?  1'b0 : 1'b1 ;
124     assign vga_vsync_sig = ( v_count < 10'd4    ) ?  1'b0 : 1'b1 ;
125         
126     assign vga_vlddata_flag =r_vlddata_flag ;
127     
128     assign vga_column_addr = r_vlddata_flag ? ( h_count - 11'd216 ) : 11'd0 ;
129     assign vga_row_addr    = r_vlddata_flag ? ( v_count - 10'd27   ) : 10'd0 ;
130     
131     /*****************************************************/
132     
133 endmodule
vga_sync_module
1 modulevga_rom_data_module(
2     
3     //System input
4 vga_clk ,
5 rst_n ,
6     //input
7 vga_rom_addr ,
8     
9     //output
10 vga_rom_data 
11     
12 );
13 
14     /***************  Port Declaration  ******************/
15     
16     //System input
17     inputvga_clk ;
18     inputrst_n ;
19     
20     //input
21     inputvga_rom_addr ;
22     
23     //output
24     outputvga_rom_data ;
25 
26     /************  Port data type declaration  *************/
27     wire [5:0] vga_rom_addr ;
28     wire [63:0] vga_rom_data ;
29 
30     /****************  Define Parameter  *****************/
31 
32     /***************  Internal Registers  *****************/
33     reg [63:0] r_rom_data ;
34     /******************  Internal Wire  ******************/
35     wire [5:0] w_rom_addr =vga_rom_addr  ;
36     
37     /****************  Code Starts Here  *****************/
38     //The ROM DATA LUT
39     
40     always @ ( posedge vga_clk or negedgerst_n )
41         if( !rst_n )
42             begin
43                     //w_rom_addr <= 6'd0 ;     不能给wire 赋值   
44                     r_rom_data <= 64'd0 ;
45             end
46         else 
47             case( w_rom_addr )
48                 6'd0 :
49                         r_rom_data <= 64'h0000_0000_0000_0000 ;
50                 6'd1 :
51                         r_rom_data <= 64'h0000_0000_0000_0000 ;
52                 //add the other data
53                 
54             endcase 
55     
56     /*****************************************************/
57     assign vga_rom_data =r_rom_data ;
58     
59     /*****************************************************/
60     
61 endmodule
vga_rom_data_module
1 modulevga_display_control_module(
2 
3     //System input
4 vga_clk ,
5 rst_n ,
6     
7     //input
8 vga_vlddata_flag ,
9 vga_column_addr ,
10 vga_row_addr ,
11     
12 vga_rom_data ,
13     
14     //output
15 vga_rom_addr ,
16     
17 vga_red_sig ,
18 vga_green_sig ,
19 vga_blue_sig 
20     
21 );
22     
23     /***************  Port Declaration  ******************/
24     
25     //System input
26     input vga_clk ;                    //vga_clk = 40MHz
27     inputrst_n ;
28     
29     //input
30     inputvga_vlddata_flag ;
31     input [10:0] vga_column_addr ;
32     input [9:0] vga_row_addr ;
33     
34     input [63:0] vga_rom_data ;
35     
36     //output
37     output [5:0] vga_rom_addr ;
38     
39     outputvga_red_sig ;
40     outputvga_green_sig ;
41     outputvga_blue_sig ;
42     
43     /************  Port data type declaration  *************/
44 
45     /****************  Define Parameter  *****************/
46 
47 
48 
49     /***************  Internal Registers  *****************/
50     //reg r_display_flag ;           //for exam 9-2
51     reg [5:0] row_n ;
52     reg [5:0] column_n ;
53     
54     /******************  Internal Wire  ******************/
55 
56     /****************  Code Starts Here  *****************/
57     
58     //code for exam 9-3
59     //to get row number
60     always @ ( posedge vga_clk or negedgerst_n) 
61         if( !rst_n )
62             begin
63                     //r_display_flag <= 1'b0 ;
64                     row_n <= 6'd0 ;
65             end
66         else if ( vga_vlddata_flag && ( vga_row_addr < 10'd64) ) 
67             begin
68                     row_n <= vga_row_addr[5:0] ;
69             end
70     
71     //to get column number
72     always @ ( posedge vga_clk or negedgerst_n) 
73         if( !rst_n )
74             begin
75                     //r_display_flag <= 1'b0 ;
76                     column_n <= 6'd0 ;
77             end
78         else if ( vga_vlddata_flag && ( vga_column_addr < 11'd64) ) 
79             begin
80                     column_n <= vga_column_addr[5:0]  ;
81             end
82     /*****************************************************/
83     assign vga_rom_addr =row_n ;
84     
85     assign vga_red_sig = ( vga_vlddata_flag && ( vga_rom_data [63-column_n] )) ? 1'b1 : 1'b0 ;
86     assign vga_green_sig = ( vga_vlddata_flag && ( vga_rom_data [63-column_n] ))  ? 1'b1 : 1'b0 ;
87     assign vga_blue_sig = ( vga_vlddata_flag && ( vga_rom_data [63-column_n] )) ? 1'b1 : 1'b0 ;
88         
89     /*****************************************************/
90 
91 
92 endmodule
vga_display_control_module

小弟万分感谢~

蹒跚在信号处理的道路上~

张小朋友要加油啊~

免责声明:文章转载自《黑金社区 FPGA 那些事儿--Verilog 建模设计 学习 试验九 VGA显示 试验》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows批处理 (cmd/bat) 编程详解Java获取Object属性值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FPGA 移交代码学习——Map错误 ODDR2 使用问题

这段时间一直忙贴片生产相关事情,又是搬家,都没有什么时间好好整整。 前人移交过来的记录仪代码,发现一个BUG , 1 wire [8:0] fchk_shift_r1 = fenergy_chk<<1; 2 wire [9:0] fchk_shift_r2 = fenergy_chk<<2; 3 wire [10:0]fchk_sh...

移动端屏幕适配+事件+常见问题解决

移动端屏幕适配 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 移动端屏幕适配与响应式的区别移动端屏幕适配: 移动端 宽高% / rem 字体px 宽...

Linux程序调试GDB——数据查看

查看栈信息 当程序被停住了,首先要确认的就是程序是在哪儿被断住的。这个一般是通过查看调用栈信息来看的。在gdb中,查看调用栈的命令是backtrace,可以简写为bt。 (gdb) bt#0 pop () at stack.c:10#1 0x080484a6 in main () at main.c:12 也可以通过info stack命令实现类似的功能...

FPGA前仿真后仿真

前仿真 后仿真 时序(综合后)仿真 时序仿真将时延考虑进去,包括综合后产生的(与、或、非)门时延,还有布局布线产生的时延。 综合(Synthesize),就是将HDL语言设计输入翻译成由与、或、非门和RAM、触发器等逻辑单元组成的网表。综合后可生成综合后仿真模型(Generate Post-Synthesis Simulation Model)。 综合后...

fpga图片灰度处理

vga显示静态图品主要分为两个部分,一个是驱动vga,另一部分控制vga显示。 vga驱动部分之前写过,直接例化过来用即可。 另一个是vga显示,从网上找了一个200*200的lena图品,然后用BMP2Mif软件 将图片转换成mif文件,24*40000,24代表rgb三原色,4000代表像素,在200*200 的区域内,一共有40000个像素点,然后...

.net Core使用EFCore连接数据库

一、SQL Service 1.创建实体类    public class Student { public int Id { get; set; } [Required] [Display(Name ="名:")] public string FirstName{ get; set;...