咨询
19924911320
1.1 总体设计
1.1.1 概述
液晶显示器是一-种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。
1.1.2 设计目标
1. 在7寸LCD显示屏上实现明德扬**图标的左上角显示和大写字母“E”图片的居中显示;
2. 可以选择使用上位机还是按键来控制“E”图片的放大和缩小;
3. 并且统计1秒时间图像的帧率。
1.1.3 系统结构框图
系统结构框图如下所示:
1.1.4 模块功能
以下本工程所用到的所有模块中,除了PicZoomInAndOut模块都是明德扬提供的可用的IP模块,这些模块不允许修改避免调用IP模块使用时出现问题。
Ø mdyPllAltera模块实现功能
1. 将输入的50MHz时钟分频输出40MHz的时钟。
Ø mdyRom模块实现功能
1. 存储明德扬**图标数据;
2. 存储大小字母“E”图像数据。
Ø mdyCfg模块实现功能
top_uart_cfg
1. 对接收的数据进行串并转换;
2. 对发送的数据进行并串转换。
mdyCfgCtrl
1. 对传输的指令进行解析。
Ø mdyKey模块实现功能
1. 检测按下的按键并输出对应按键有效的数值。
Ø PicZoomInAndOut模块实现功能
1. 规定了明德扬**图标和大写字母“E”显示的区域;
2. 控制大写字母“E”显示的放大和缩小。
Ø mdyLcd驱动模块实现功能
1、 产生驱动LCD屏显示的时序。
Ø mdyGetEdge模块实现功能
1. 对信号的边沿进行检测。
Ø mdyStatic_1S模块实现功能
1. 统计一段时间内的某些信号的数据。
1.1.5 顶层信号
1.1.6 参考代码
1. module top_mdyLcdPicZoomInAndOut(
2. clk ,
3. rst_n ,
4. key ,
5. uart_rxd ,
6.
7. uart_txd ,
8. lcd_hs ,
9. lcd_vs ,
10. lcd_de ,
11. lcd_dat ,
12. lcd_clk
13. );
14.
15. parameter PICTURE_W = 24 ;
16. parameter KEY_W = 4 ;
17.
18.
19. input clk ;//50MHz
20. input rst_n ;
21. input [KEY_W-1 :0] key ;
22. input uart_rxd ;
23.
24. output uart_txd ;
25. output lcd_hs ;
26. output lcd_vs ;
27. output lcd_de ;
28. output [PICTURE_W-1:0] lcd_dat ;
29. output lcd_clk ;
30.
31. wire uart_txd ;
32. wire lcd_hs ;
33. wire lcd_vs ;
34. wire lcd_de ;
35. wire [PICTURE_W-1:0] lcd_dat ;
36. wire lcd_clk ;
37.
38. wire clk_0 ;
39. wire [23:0] pic_data ;
40. wire [10:0] req_x ;
41. wire [ 9:0] req_y ;
42. wire frame_start ;
43. wire [KEY_W-1:0] key_vld ;
44. wire frame_pos ;
45. wire [63:0] uart_dout ;
46. wire uart_dout_vld ;
47. wire [63:0] cfgCtrl_dout ;
48. wire cfgCtrl_dout_vld ;
49.
50. `include "mdyCfg_wire.v"
51.
52. /****************** PLL模块 *******************************/
53.
54. mdyPllAltera#(.C0_M(4),.C0_D(5)) u1_pll_40m(
55. .areset (~rst_n ), //高电平有效
56. .inclk0 (clk ),
57. .c0 (clk_0 ),
58. .c1 ( ),
59. .c2 ( ),
60. .c3 ( ),
61. .c4 ( ),
62. .locked ( )
63.
64. );
65.
66. /****************** LCD驱动模块 *******************************/
67.
68. mdyLcd#(.D_DLY(1)) u2_lcd_driver(
69. .clk (clk_0 ),//40MHz
70. .rst_n (rst_n ),
71. .ack_data (pic_data ),
72.
73. .req_x (req_x ),
74. .req_y (req_y ),
75. .req_en ( ),
76. .req_addr ( ),
77.
78. .hys (lcd_hs ),
79. .vys (lcd_vs ),
80. .lcd_de (lcd_de ),
81. .lcd_rgb (lcd_dat ),
82. .lcd_dclk (lcd_clk ),
83.
84. .frame_start (frame_start )
85. );
86.
87. /****************** 功能模块 *******************************/
88.
89. PicZoomInAnDout u3_PicZoomInAnDout(
90. .clk (clk_0 ),
91. .rst_n (rst_n ),
92. .mode (MODE_SELECT_en),
93. .key_en (key_vld ),
94. .cpu_ZoomIn (SOFTWARE_CTRL_in),
95. .cpu_ZoomOut (SOFTWARE_CTRL_out),
96.
97. .req_h (req_x ),
98. .req_v (req_y ),
99. .pic_data (pic_data )
100.
101. );
102.
103.
104. /********************* 按键模块 ****************************/
105.
106. mdyKey#(.DATA_W(24),.TIME_20MS(8_00_000)) u4_mdykey(
107. .clk (clk_0 ),
108. .rst_n (rst_n ),
109. .key_in (key ),
110. .key_vld (key_vld )
111. );
112. /********************* 边沿检测模块 ****************************/
113.
114. mdyGetEdge u5_GetEdge(
115. .clk (clk_0 ),
116. .rst_n (rst_n ),
117. .cfg_init_value (0 ),
118. .din (frame_start ),
119. .dout_pos (frame_pos),
120. .dout_neg ( ),
121. .dout_pos_reg ( ),
122. .dout_neg_reg ( )
123. );
124.
125. /********************* 1s统计模块 ****************************/
126.
127. mdyStatic_1S u6_Static_1S(
128. .clk (clk_0 ),
129. .rst_n (rst_n ),
130. .cfg_num_1s (50_000_000 ),
131. .cfg_add_1s (1 ),
132. .din_vld (frame_pos ),
133. .sta_1s (DATA_FRAME_data ),//32bit
134. .sta_rt ( )
135. );
136.
137. /********************* 指令模块 ****************************/
138.
139. top_uart_cfg#(.BPS(4167)) u7_top_uart_cfg(
140. .clk (clk_0 ),
141. .rst_n (rst_n ),
142. .cfg_head (16'h55d5 ),
143. .rx (uart_rxd ),
144. .tx (uart_txd ),
145. .din (cfgCtrl_dout ),//s2p
146. .din_vld (cfgCtrl_dout_vld ),
147. .din_rdy ( ),
148. .dout (uart_dout ),//p2s
149. .dout_vld (uart_dout_vld )
150.
151. );
152.
153. mdyCfgCtrl u8_mdyCfgCtrl(
154. `include "mdyCfg_inst.v"
155. .clk (clk_0 ),
156. .rst_n (rst_n ),
157. .din (uart_dout ),
158. .din_vld (uart_dout_vld ),
159. .dout (cfgCtrl_dout ),
160. .dout_vld (cfgCtrl_dout_vld )
161.
162. );
163.
164. /*************************************************/
165. endmodule
1.2 mdyPllAltera模块接口说明
1.2.1 接口信号
1.2.2 使用说明
本模块主要用于产生LCD驱动时序所需要的时钟
1.3 mdyRom模块设计
1.3.1 接口信号
1.3.2 设计思路
本模块主要用于存储明德扬**图标和大小字母“E”图像的数据
1.4 mdyCfg模块接口说明
1.4.1 接口信号
top_uart_cfg模块的接口信号:
mdyCfgCtrl模块的接口信号:
1.4.2 使用说明
本模块主要用于对传输的数据进行串并转换和解析传输的指令
关于具体的指令信息可以查看工程里的XML表格regTable_mdyLcdPicZoomInAndOut.xml:
上位机指令全长64bit,其中,
1.5 mdyKey模块接口说明
1.5.1 接口信号
下面为使用独立按键时的接口信号:
1.5.2 使用说明
本模块主要检测按下的按键并输出对应按键的有效指示信号
1.6 PicZoomInAndOut模块接口说明
1.6.1 接口信号
1.6.2 参考代码
1. module PicZoomInAnDout(
2. clk ,
3. rst_n ,
4. mode ,
5. key_en ,
6. cpu_ZoomIn ,
7. cpu_ZoomOut ,
8.
9. req_h ,//h_cnt - THB
10. req_v ,//v_cnt - TVB
11. pic_data
12. );
13.
14. //LCD显示屏居中
15. parameter HDE_CENTRE = 400 ;//800/2
16. parameter VDE_CENTRE = 240 ;//480/2
17.
18.
19. parameter DATA_W = 8;
20. parameter KEY_W = 4;
21.
22. input clk ;
23. input rst_n ;
24. input mode ;
25. input cpu_ZoomIn ;
26. input cpu_ZoomOut ;
27. input [KEY_W-1 :0] key_en ;
28.
29. input [10:0] req_h ;
30. input [ 9:0] req_v ;
31. output [23:0] pic_data ;
32.
33. reg [23:0] pic_data ;
34.
35. reg [15:0] **_rom_addr ;
36. reg **_rom_area ;
37. wire [7:0] **_rom_data ;
38. reg [17:0] e_rom_addr ;
39. reg e_rom_area ;
40. reg [2:0] e_rom_addr_low ;
41. reg e_dataout ;
42. wire [7:0] e_rom_data ;
43.
44. reg [ 2:0] size ;
45. reg [ 2:0] size_ff0 ;
46.
47. wire [9:0] len_size ;
48. wire [9:0] wid_size ;
49. wire [9:0] e_x0 ;
50. wire [9:0] e_x1 ;
51. wire [9:0] e_y0 ;
52. wire [9:0] e_y1 ;
53. wire [9:0] x ;
54. wire [9:0] y ;
55.
56. /******************************************************/
57.
58. always @(posedge clk or negedge rst_n)begin
59. if(rst_n==1'b0)begin
60. size <= 0;
61. end
62. else if(mode==1)begin
63. if(cpu_ZoomOut)begin
64. if(size!=3)
65. size <= size + 1;
66. end
67. else if(cpu_ZoomIn)begin
68. if(size!=0)
69. size <= size - 1;
70. end
71. end
72. else if(mode==0)begin
73. if(key_en==4'b0010)begin
74. if(size!=3)
75. size <= size + 1;
76. end
77. else if(key_en==4'b0001)begin
78. if(size!=0)
79. size <= size - 1;
80. end
81. end
82. end
83.
84. always @(posedge clk or negedge rst_n)begin
85. if(rst_n==1'b0)begin
86. size_ff0 <= 0;
87. end
88. else if(req_h==(HDE_CENTRE-200) && req_v==(VDE_CENTRE-150)) begin
89. size_ff0 <= size;
90. end
91. end
92.
93. assign len_size = 400 >> size_ff0;//缩小多少倍
94. assign wid_size = 300 >> size_ff0;
95.
96.
97. assign e_x0 = (HDE_CENTRE-len_size[9:1]);
98. assign e_x1 = (HDE_CENTRE+len_size[9:1]);
99. assign e_y0 = (VDE_CENTRE-wid_size[9:1]);
100. assign e_y1 = (VDE_CENTRE+wid_size[9:1]);
101.
102. assign x = (req_h-e_x0)<<size;
103. assign y = (req_v-e_y0)<<size;
104.
105.
106.
107. always @(*)begin
108. e_rom_area = req_h >=(e_x0+5) && req_h < e_x1 && req_v >= e_y0 && req_v < (e_y1+5);
109. end
110.
111. always @(*)begin
112. e_rom_addr = x + 400*y;
113. end
114.
115.
116. /******************************************************/
117.
118. //120*55
119. always @(*)begin
120. **_rom_area = req_h >=0 && req_h < 119 && req_v >= 0 && req_v < 54;
121. end
122.
123. always @(*)begin
124. **_rom_addr = req_h + 120*req_v;
125. end
126.
127. /******************************************************/
128.
129. always @(posedge clk or negedge rst_n)begin
130. if(rst_n==1'b0)begin
131. e_rom_addr_low <= 0;
132. end
133. else begin
134. e_rom_addr_low <= e_rom_addr[2:0];
135. end
136. end
137.
138. always @(*)begin
139. if(e_rom_area)
140. e_dataout = ~e_rom_data[7-e_rom_addr_low];
141. else
142. e_dataout = 1;
143. end
144.
145. always @(posedge clk or negedge rst_n)begin
146. if(rst_n==1'b0)begin
147. pic_data <= 0;
148. end
149. else if(e_rom_area)begin
150. pic_data <= {24{e_dataout}};
151. end
152. else if(**_rom_area)begin
153. pic_data <= {**_rom_data[7:5],5'b11111,**_rom_data[4:2],5'b11111,**_rom_data[1:0],6'b111111} ;
154. end
155. end
156. /******************************************************/
157. mdyRom#(.MIF("../src/data/**.mif"),.DEP(8192),.D_W(8)) u_fpga_rom(
158. .address (**_rom_addr ),
159. .clock (clk ),
160. .q (**_rom_data )
161. );
162.
163. mdyRom#(.MIF("../src/data/e.mif"),.DEP(16384),.D_W(8)) u_e_rom(
164. .address (e_rom_addr[16:3] ),
165. .clock (clk ),
166. .q (e_rom_data )
167. );
168.
169. endmodule
1.7 mdyLcd驱动模块设计
1.7.1 接口信号
1.7.1 使用说明
本模块主要用于产生LCD显示屏的驱动时序
1.8 mdyGetEdge模块接口说明
1.8.1 接口信号
1.8.2 使用说明
本模块主要用于检测特定信号的边沿
1.9 mdyStatic_1S模块接口说明
1.9.1 接口信号
1.9.2 使用说明
本模块主要用于统计数据
1.10 效果和总结
以下为工程上板后的现象效果图:
Ø mp801开发板——缩小0倍
Ø mp801开发板——缩小1倍
Ø mp801开发板——缩小2倍
Ø mp801开发板——缩小3倍
|
|