VGA实验 :逻辑分析仪

经过了这么久,逻辑分析仪已经基本上完成了。

一、功能:

1、对采样得到的4路64位数据以波形的形式显示。

2、支持9中采样频率:100M,50M,10M,2M,1M,500K,200K,100K,10K;

3、支持三种采样模式:模式一,显示触发后64位数据,模式二:显示触发前后32位数据,模式三:显示触发前64位数据。

4、支持边沿触发(上升沿和下降沿)的4路通道的逻辑组合,1000:通道0上升沿,其他通道下降沿。

5、支持波形的放大和平移。

二、器件:DE2开发板,芯片:cyclone II   ep2c35f672c6

三、模块划分:

1、sys_ctrl 模块:    包括系统复位信号,例化PLL,输出clk_100m和clk_25m,分别提供给sampling_ctrl模块和vga模块;

2、sample模块:触发控制和模式选择设置,采样频率设置,采样模式设置、数据采集及存储等相关设计;

3、vga显示模块:     包含VGA显示驱动相关设计(最只要);

4、data_gene模块:   产生4路数据信号。

由于其他模块比较简单就不做介绍了,只对vga模块做下介绍。

四、VGA

1、功能:

      a、负责整个vga模块的25MHz的时钟和复位信号。

      b、提供与外界的接口:采样模式选择,采样频率选择,触发模式的选择。

      c、把各个vga控制模块输出的r,g,b颜色信号通过相与的操作叠加在一起。

      d、从输出坐标到从rom读数据需要3个周期的延时,所以需要一个延时3个单位的模块控制输出的坐标与显示的字样同步。

2、子模块列表:

模块名称

功能

sync_module

控制显示标准,x,y坐标和有效区域

vga_control_topic

控制“DIY 逻辑分析仪”的显示

vga_control_ch

控制通道的显示

vga_control_mode

控制采样模式的显示

vga_control_trigger

控制触发模式的显示

vga_control_rate

控制采样频率的显示

vga_control_wave

控制波形的显示

3、源代码:由于sync_module和vga_control_topic在前面实验已经介绍过了,就不再重复。

a、vga_control_ch

  1 module vga_control_ch( clk_25m,rst_n,
2 vga_r_ch,vga_g_ch,vga_b_ch,
3 x,y,valid,
4 rom_data_ch,rom_addr_ch,
5 rom_addr_num_0,rom_data_num_0,
6 rom_addr_num_1,rom_data_num_1,
7 rom_addr_num_2,rom_data_num_2,
8 rom_addr_num_3,rom_data_num_3
9 );
10
11 input clk_25m;
12 input rst_n;
13 input [9:0]x; //输入列坐标
14 input [9:0]y; //输入行坐标
15 input valid; //输入有效区域
16 input [31:0]rom_data_ch; //存储“通道”两个字的的rom的输入数据信号
17 input [7:0]rom_data_num_0; //存储“0”rom的输入数据信号
18 input [7:0]rom_data_num_1;
19 input [7:0]rom_data_num_2;
20 input [7:0]rom_data_num_3;
21 output [4:0]rom_addr_ch; //存储“通道”rom的地址信号
22 output [4:0]rom_addr_num_0; //存储“0”rom的地址信号
23 output [4:0]rom_addr_num_1;
24 output [4:0]rom_addr_num_2;
25 output [4:0]rom_addr_num_3;
26 output [9:0]vga_r_ch; //10位的vga的red信号
27 output [9:0]vga_g_ch; //10位的vga的green信号
28 output [9:0]vga_b_ch; //10位的vga的blue信号
29 /************************************/
30
31
32 /************************************/
33 //字符“通道”存储器的地址计算
34 reg [4:0]addr;
35
36 always @(posedge clk_25m or negedge rst_n)
37 if(!rst_n) addr<=5'b0;
38 else if (y==10'd150) addr<=5'b0;
39 else if(y>10'd150 && y<10'd170)addr<=y-10'd150; //第0个通道的有效地址
40
41 else if (y==10'd190) addr<=5'b0;
42 else if(y>10'd190 && y<10'd210)addr<=y-10'd190; //第1个通道的有效地址
43
44 else if (y==10'd230) addr<=5'b0;
45 else if(y>10'd230 && y<10'd250)addr<=y-10'd230; //第2个通道的有效地址
46
47 else if (y==10'd270) addr<=5'b0;
48 else if(y>270)addr<=y-10'd270; //第3个通道的有效地址
49
50 /************************************/
51
52
53 /************************************/
54 wire dis_ch0;
55 wire dis_ch1;
56 wire dis_ch2;
57 wire dis_ch3;
58 assign dis_ch0=(y>=10'd150)& (y<=10'd165) &(x>=160) &(x<=10'd191); //channel0有效区域
59 assign dis_ch1=(y>=10'd190)& (y<=10'd205) &(x>=160) &(x<=10'd191); //channel1有效区域
60 assign dis_ch2=(y>=10'd230)& (y<=10'd245) &(x>=160) &(x<=10'd191); //channel2 有效区域
61 assign dis_ch3=(y>=10'd270)& (y<=10'd285) &(x>=160) &(x<=10'd191); //channel3 有效区域
62 /************************************/
63 //dispaly num
64 reg [4:0]addr_0;
65 reg [4:0]addr_1;
66 reg [4:0]addr_2;
67 reg [4:0]addr_3;
68 always @(posedge clk_25m or negedge rst_n)
69 if(!rst_n)
70 begin addr_0<=5'b0;
71 addr_1<=5'b0;
72 addr_2<=5'b0;
73 addr_3<=5'b0;
74 end
75 else if (y==150)
76 addr_0<=5'b0;
77 else if (y>150&y<190) //“0”的有效地址
78 addr_0<=y-150;
79 else if (y==190)
80 addr_1<=5'b0;
81 else if(y>190&y<230) //“1”的有效地址
82 addr_1<=y-190;
83 else if (y==230)
84 addr_2<=5'b0;
85 else if (y>230 & y<270) //“2”的有效地址
86 addr_2<=y-230;
87 else if (y==270)
88 addr_3<=5'b0;
89 else if (y>270 & y<286) //“3”的有效地址
90 addr_3<=y-270;
91 else
92 begin addr_0<=5'b0;
93 addr_1<=5'b0;
94 addr_2<=5'b0;
95 addr_3<=5'b0;
96 end
97 wire ch_num_0;
98 wire ch_num_1;
99 wire ch_num_2;
100 wire ch_num_3;
101 assign ch_num_0=((x>=205&x<=212)&(y>=150&y<=165)); //“0”的有效区域
102 assign ch_num_1=((x>=205&x<=212)&(y>=190&y<=205)); //“1”的有效区域
103 assign ch_num_2=((x>=205&x<=212)&(y>=230&y<=245)); //“2”的有效区域
104 assign ch_num_3=((x>=205&x<=212)&(y>=270&y<=285)); //“3”的有效区域
105 /************************************/
106 reg [9:0]r;
107 reg [9:0]g;
108 reg [9:0]b;
109
110 always @ (posedge clk_25m)
111 if(!valid) begin
112 r<=10'd0;
113 g<=10'd0;
114 b<=10'd0;
115 end
116 else if({dis_ch0,dis_ch1,dis_ch2,dis_ch3}>0) //4个通道显示
117
118 begin
119 if(rom_data_ch[10'd191-x]) //31-(x-160)=191-x
120 begin r<=10'h3ff;
121 g<=10'h000;
122 b<=10'h000;
123 end
124 else begin
125 r<=10'h3ff;
126 g<=10'h3ff;
127 b<=10'h3ff;
128 end
129 end
130 else if(ch_num_0) //dispaly 0 (ch0)
131 begin if (rom_data_num_0[212-x])
132 begin
133 b<=10'h000;
134 g<=10'h000;
135 r<=10'h3ff;
136 end
137 else begin
138 b<=10'h3ff;
139 g<=10'h3ff;
140 r<=10'h3ff;
141 end
142 end
143 else if(ch_num_1) //display 1 (ch1)
144 begin if (rom_data_num_1[212-x])
145 begin
146 b<=10'h000;
147 g<=10'h000;
148 r<=10'h3ff;
149 end
150 else begin b<=10'h3ff;
151 g<=10'h3ff;
152 r<=10'h3ff;
153 end
154 end
155 else if(ch_num_2) //display 2 (ch2)
156 begin if (rom_data_num_2[212-x])
157 begin
158 b<=10'h000;
159 g<=10'h000;
160 r<=10'h3ff;
161 end
162 else begin
163 b<=10'h3ff;
164 g<=10'h3ff;
165 r<=10'h3ff;
166 end
167 end
168 else if(ch_num_3) //display 3(ch3)
169 begin if (rom_data_num_3[212-x])
170 begin
171 b<=10'h000;
172 g<=10'h000;
173 r<=10'h3ff;
174 end
175 else begin b<=10'h3ff;
176 g<=10'h3ff;
177 r<=10'h3ff;
178 end
179 end
180 else begin b<=10'h3ff;
181 g<=10'h3ff;
182 r<=10'h3ff;
183 end
184 /**********************************************/
185
186
187 /**********************************************/
188
189 assign vga_r_ch=r;
190 assign vga_g_ch=g;
191 assign vga_b_ch=b;
192 assign rom_addr_ch=addr;
193 assign rom_addr_num_0=addr_0;
194 assign rom_addr_num_1=addr_1;
195 assign rom_addr_num_2=addr_2;
196 assign rom_addr_num_3=addr_3;
197
198 /**********************************************/
199
200
201
202 endmodule

b、vga_control_mode

  1 module vga_control_mode(clk_25m,rst_n,
2 vga_r_mode,vga_g_mode,vga_b_mode,
3 x,y,valid,
4 mode,
5 rom_data_mode,rom_addr_mode
6 );
7
8
9 input clk_25m;
10 input rst_n;
11 input [9:0]x; //输入列坐标
12 input [9:0]y; //输入行坐标
13 input valid; //输入有效区域
14 input [1:0]mode; //模式选择:00:模式1,01:模式2,11:模式3
15 input [79:0]rom_data_mode; //存储“采样模式:”rom的有效数据
16 output [4:0]rom_addr_mode; //存储“采样模式:”rom的有效地址
17 output [9:0]vga_r_mode; //vga显示控制
18 output [9:0]vga_g_mode;
19 output [9:0]vga_b_mode;
20
21 /*************************************/
22
23 /*************************************/
24 //5计数器
25
26 reg [2:0]count_5;
27
28
29 always @(posedge clk_25m or negedge rst_n)
30 if(!rst_n)
31 count_5<=3'b0;
32 else if (count_5==3'd5)
33 count_5<=3'd1;
34 else count_5<=count_5+3'd1;
35
36 /*************************************/
37
38
39 /*************************************/
40 //mode
41 reg[4:0]addr;
42 wire dis_mode;
43 always @(posedge clk_25m or negedge rst_n) //“采样模式:”rom的有效地址计算
44 if(!rst_n) addr<=5'b0;
45 else if(y==10'd320) addr<=5'b0;
46 else if (y>10'd320)
47 addr<=y-10'd320;
48
49 assign dis_mode=((y>=10'd320)&(y<=10'd335)&(x>=160)&(x<=239)); //显示的有效区域
50
51 /*************************************/
52
53
54
55 /*************************************/
56
57 //mode_select
58 wire mode_1,mode_2,mode_3;
59 reg mode_select;
60 assign mode_1=(y>=323&y<=333 & x>=270&x<=280);
61 assign mode_2=(y>=323&y<=333 & x>=315&x<=325);
62 assign mode_3=(y>=323&y<=333 & x>=370&x<=380);
63
64
65 always @(posedge clk_25m or negedge rst_n)
66
67 if (!rst_n) mode_select<=1'b0;
68 else if(mode==2'b00) mode_select<=mode_1; //00:选择模式1的有效区域
69 else if(mode==2'b01) //01:选择模式2的有效区域
70 mode_select<=mode_2;
71 else if (mode==2'b11) //11:选择模式3的有效区域
72 mode_select<=mode_3;
73 else mode_select<=1'b0;
74 /**************************************/
75
76
77 /**************************************/
78 reg [9:0]r;
79 reg [9:0]g;
80 reg [9:0]b;
81
82 always @ (posedge clk_25m)
83 if(!valid) begin
84 r<=10'd0;
85 g<=10'd0;
86 b<=10'd0;
87 end
88 else if(dis_mode) //显示“采样模式”
89 begin if(rom_data_mode[239-x]) //160-(x-79)=239-x
90 begin r<=10'h3ff;
91 g<=10'h000;
92 b<=10'h000;
93 end
94 else begin r<=10'h3ff;
95 g<=10'h3ff;
96 b<=10'h3ff;
97 end
98 end
99 else if((x>=260&&x<=264)&&(y>=320&&y<=335)&&(count_5==3'd5)) //显示1条竖格
100 begin
101 b<=10'h000;
102 g<=10'h000;
103 r<=10'h3ff;
104 end
105 else if ((x>=300&&x<=309)&&(y>=320&&y<=335)&&(count_5==3'd5)) //显示2条竖格
106 begin
107 b<=10'h000;
108 g<=10'h000;
109 r<=10'h3ff;
110 end
111
112 else if ((x>=350&&x<=364)&&(y>=320&&y<=335)&&(count_5==3'd5)) //显示3条竖格
113 begin
114 b<=10'h000;
115 g<=10'h000;
116 r<=10'h3ff;
117 end
118 else if (mode_select) //mode_select
119 begin
120 b<=10'h000;
121 g<=10'h000;
122 r<=10'h3ff;
123 end
124 else begin
125 b<=10'h3ff;
126 g<=10'h3ff;
127 r<=10'h3ff;
128 end
129 /****************************************/
130
131
132 /****************************************/
133 assign rom_addr_mode=addr;
134 assign vga_r_mode=r;
135 assign vga_b_mode=b;
136 assign vga_g_mode=g;
137 /****************************************/
138 endmodule

c、vga_control_trigger

  1 module vga_control_trigger (
2 clk_25m,rst_n,
3 vga_r_tr,vga_g_tr,vga_b_tr,
4 x,y,valid,
5 rom_addr_tr,rom_data_tr,
6 addr_0,data_0,
7 addr_1,data_1,
8 ch0_tri,ch1_tri,ch2_tri,ch3_tri
9 );
10
11 input clk_25m;
12 input rst_n;
13 input [9:0]x;
14 input [9:0]y;
15 input valid;
16 input ch0_tri; //通道0触发选择,由拨码开关控制
17 input ch1_tri; //通道1触发选择,由拨码开关控制
18 input ch2_tri; //通道2触发选择,由拨码开关控制
19 input ch3_tri; //通道3触发选择,由拨码开关控制
20 input [79:0]rom_data_tr; //“触发模式:”rom的有效数据
21 input [7:0]data_0; //“0”rom的有效数据
22 input [7:0]data_1; //“1”rom的有效数据
23 output [4:0]rom_addr_tr; //“触发模式:”rom的有效数据
24 output [4:0]addr_0;
25 output [4:0]addr_1;
26 output [9:0]vga_r_tr;
27 output [9:0]vga_g_tr;
28 output [9:0]vga_b_tr;
29
30 /*****************************************/
31
32
33 /*****************************************/
34 //trigger
35 reg[4:0]addr;
36 wire dis_trigger;
37 always @(posedge clk_25m or negedge rst_n) //“触发模式:”rom的有效地址计算
38 if(!rst_n) addr<=5'b0;
39 else if(y==10'd360) addr<=5'b0;
40 else if (y>10'd360)
41 addr<=y-10'd360;
42
43 assign dis_trigger=((y>=10'd360)&(y<=10'd375)&(x>=160)&(x<=239)); //显示“触发模式:”有效区域
44
45 /*****************************************/
46
47
48 /*****************************************/
49 //0,1的有效地址计算
50 reg [4:0]addr_0;
51 reg [4:0]addr_1;
52 always @(posedge clk_25m or negedge rst_n)
53 if(!rst_n)
54 begin addr_0<=5'b0;
55 addr_1<=5'b0;
56 end
57 else if (y==360)
58 begin addr_0<=5'b0;
59 addr_1<=5'b0;
60 end
61 else if (y>10'd360)
62 begin addr_0<=y-10'd360;
63 addr_1<=y-10'd360;
64 end
65 wire tr_1;
66 wire tr_2;
67 wire tr_3;
68 wire tr_4;
69 assign tr_1=((y>=10'd360)&(y<=10'd375)&(x>=250)&(x<=258)); //通道0的触发有效区域
70 assign tr_2=((y>=10'd360)&(y<=10'd375)&(x>=280)&(x<=288)); //通道1的触发有效区域
71 assign tr_3=((y>=10'd360)&(y<=10'd375)&(x>=310)&(x<=318)); //通道2的触发有效区域
72 assign tr_4=((y>=10'd360)&(y<=10'd375)&(x>=340)&(x<=348)); //通道3的触发有效区域
73 /*****************************************/
74
75
76 /*****************************************/
77
78 reg [9:0]r;
79 reg [9:0]g;
80 reg [9:0]b;
81
82 always @ (posedge clk_25m)
83 if(!valid) begin
84 r<=10'd0;
85 g<=10'd0;
86 b<=10'd0;
87 end
88 else if(dis_trigger) //显示:触发模式:
89 begin if(rom_data_tr[239-x]) //160+79
90 begin
91 r<=10'h3ff;
92 g<=10'h000;
93 b<=10'h000;
94 end
95 else begin r<=10'h3ff;
96 g<=10'h3ff;
97 b<=10'h3ff;
98 end
99 end
100 else if(tr_1) //dis_3
101 begin if(ch0_tri==1'b1) //如果ch0_tri==1,
102 begin if(data_1[258-x]) //显示:1
103 begin
104 b<=10'h000;
105 g<=10'h000;
106 r<=10'h3ff;
107 end
108 else
109 begin
110 b<=10'h3ff;
111 g<=10'h3ff;
112 r<=10'h3ff;
113 end
114 end
115 else
116 begin if(data_0[258-x]) //显示:0
117 begin
118 b<=10'h000;
119 g<=10'h000;
120 r<=10'h3ff;
121 end
122 else
123 begin
124 b<=10'h3ff;
125 g<=10'h3ff;
126 r<=10'h3ff;
127 end
128 end
129 end
130 else if (tr_2==1'b1) //dis_2
131 begin
132 if(ch1_tri==1'b1) //如果ch1_tri==1,
133 begin
134 if(data_1[288-x])
135 begin
136 b<=10'h000;
137 g<=10'h000;
138 r<=10'h3ff;
139 end
140 else
141 begin
142 b<=10'h3ff;
143 g<=10'h3ff;
144 r<=10'h3ff;
145 end
146 end
147 else
148 begin
149 if(data_0[288-x])
150 begin
151 b<=10'h000;
152 g<=10'h000;
153 r<=10'h3ff;
154 end
155 else
156 begin
157 b<=10'h3ff;
158 g<=10'h3ff;
159 r<=10'h3ff;
160 end
161 end
162 end
163 else if (tr_3==1'b1) //dis_2
164 begin
165 if(ch2_tri==1'b1) //如果ch2_tri==1,
166 begin
167 if(data_1[318-x])
168 begin
169 b<=10'h000;
170 g<=10'h000;
171 r<=10'h3ff;
172 end
173 else
174 begin
175 b<=10'h3ff;
176 g<=10'h3ff;
177 r<=10'h3ff;
178 end
179 end
180 else
181 begin
182 if(data_0[318-x])
183 begin
184 b<=10'h000;
185 g<=10'h000;
186 r<=10'h3ff;
187 end
188 else
189 begin
190 b<=10'h3ff;
191 g<=10'h3ff;
192 r<=10'h3ff;
193 end
194 end
195 end
196 else if (tr_4==1'b1) //dis_3
197 begin
198 if(ch3_tri==1'b1) //如果ch3_tri==1,
199 begin
200 if(data_1[348-x])
201 begin
202 b<=10'h000;
203 g<=10'h000;
204 r<=10'h3ff;
205 end
206 else
207 begin
208 b<=10'h3ff;
209 g<=10'h3ff;
210 r<=10'h3ff;
211 end
212 end
213 else
214 begin
215 if(data_0[348-x])
216 begin
217 b<=10'h000;
218 g<=10'h000;
219 r<=10'h3ff;
220 end
221 else
222 begin
223 b<=10'h3ff;
224 g<=10'h3ff;
225 r<=10'h3ff;
226 end
227 end
228 end
229 else begin b<=10'h3ff;
230 g<=10'h3ff;
231 r<=10'h3ff;
232 end
233 /****************************************************/
234
235
236 /****************************************************/
237 assign vga_r_tr=r;
238 assign vga_g_tr=g;
239 assign vga_b_tr=b;
240 assign rom_addr_tr=addr;
241
242
243 /****************************************************/
244
245
246
247
248 endmodule


d、vga_control_rate

  1 module vga_control_rate (
2 clk_25m,rst_n,
3 vga_r_rate,vga_g_rate,vga_b_rate,
4 x,y,valid,
5 rom_addr_rate,rom_data_rate,
6 rom_addr_rate_1,rom_data_rate_1,
7 rom_addr_rate_2,rom_data_rate_2,
8 rate );
9
10 input clk_25m;
11 input rst_n;
12 input [9:0]x;
13 input [9:0]y;
14 input valid;
15 input [3:0]rate;
16 input [79:0]rom_data_rate; //“采样频率:”rom的有效输入数据信号
17 input [143:0]rom_data_rate_1; //ROM1存储:100M 50M 10M 2M 1M
18 input [143:0]rom_data_rate_2; //ROM2存储:500K 200K 100K 10K
19 output [4:0]rom_addr_rate_2;
20 output [4:0]rom_addr_rate_1;
21 output [4:0]rom_addr_rate; //“采样频率:”rom的地址信号
22 output [9:0]vga_r_rate; //控制vga的显示颜色
23 output [9:0]vga_g_rate;
24 output [9:0]vga_b_rate;
25 /**********************************************/
26
27
28 /*********************************************/
29 //rate
30 reg[4:0]addr;
31 wire dis_rate;
32 always @(posedge clk_25m or negedge rst_n) //“采样频率:”rom的有效地址
33 if(!rst_n) addr<=5'b0;
34 else if(y==10'd400) addr<=5'b0;
35 else if (y>10'd400)
36 addr<=y-10'd400;
37
38 assign dis_rate=((y>=10'd400)&(y<=10'd415)&(x>=160)&(x<=239)); //“采样频率:”有效显示区域
39
40 /*********************************************/
41
42
43 /*********************************************/
44
45 //rate_1
46 reg [4:0]addr_1;
47 wire dis_rate_1;
48 always @(posedge clk_25m or negedge rst_n) //rom1的有效地址计算
49 if(!rst_n) addr_1<=4'b0;
50 else if(y==10'd400) addr_1<=5'b0;
51 else if (y>10'd400)
52 addr_1<=y-10'd400;
53 assign dis_rate_1=((y>=10'd400)&(y<=10'd415)&(x>=250)&(x<=393)); //rom1的有效区域
54
55 /********************************/
56 //rate_2
57 reg [4:0]addr_2;
58 wire dis_rate_2;
59 always @(posedge clk_25m or negedge rst_n)
60 if(!rst_n) addr_2<=4'b0;
61 else if(y==10'd400) addr_2<=5'b0; //rom2的有效地址计算
62 else if (y>10'd400)
63 addr_2<=y-10'd400;
64 assign dis_rate_2=((y>=10'd400)&(y<=10'd415)&(x>=402)&(x<=545)); //rom2的有效区域
65
66 /*********************************************/
67
68
69 /*********************************************/
70 //rate_select
71 reg rate_select;
72 wire rate_0,rate_1,rate_2,rate_3,rate_4,rate_5,rate_6,rate_7,rate_8;
73 assign rate_0=((y>=420)&(y<=425)&(x>=265&x<=270));
74 assign rate_1=((y>=420)&(y<=425)&(x>=300&x<=305));
75 assign rate_2=((y>=420)&(y<=425)&(x>=332&x<=337));
76 assign rate_3=((y>=420)&(y<=425)&(x>=360&x<=365));
77 assign rate_4=((y>=420)&(y<=425)&(x>=385&x<=390));
78 assign rate_5=((y>=420)&(y<=425)&(x>=420&x<=425));
79 assign rate_6=((y>=420)&(y<=425)&(x>=455&x<=460));
80 assign rate_7=((y>=420)&(y<=425)&(x>=495&x<=500));
81 assign rate_8=((y>=420)&(y<=425)&(x>=530&x<=535));
82 always @(posedge clk_25m or negedge rst_n)
83
84 if (!rst_n) rate_select<=1'b0;
85 else if (rate==4'b0000) //rate=0000:100M
86 rate_select<=rate_0;
87 else if(rate==4'b0001) //rate=0001:50M
88 rate_select<=rate_1;
89 else if(rate==4'b0010) //rate=0010:10M
90 rate_select<=rate_2;
91 else if(rate==4'b0011) //rate=0011:2M
92 rate_select<=rate_3;
93 else if(rate==4'b0100) //rate=0100:1M
94 rate_select<=rate_4;
95 else if(rate==4'b0101) //rate=0101:500K
96 rate_select<=rate_5;
97 else if(rate==4'b0110) //rate=0110:200K
98 rate_select<=rate_6;
99 else if(rate==4'b0111) //rate=0111:100K
100 rate_select<=rate_7;
101 else if(rate==4'b1000) //rate=1000:10K
102 rate_select<=rate_8;
103 else rate_select<=1'b0;
104
105 /*********************************************/
106
107
108 /*********************************************/
109 reg [9:0]r;
110 reg [9:0]g;
111 reg [9:0]b;
112
113 always @ (posedge clk_25m)
114 if(!valid) begin
115 r<=10'd0;
116 g<=10'd0;
117 b<=10'd0;
118 end
119 else if (dis_rate) //显示:采样频率:
120 begin if(rom_data_rate[239-x]) //160+79
121 begin
122 r<=10'h3ff;
123 g<=10'h000;
124 b<=10'h000;
125 end
126 else
127 begin
128 r<=10'h3ff;
129 g<=10'h3ff;
130 b<=10'h3ff;
131 end
132 end
133 else if (dis_rate_1) //显示:100M 50M 10M 2M 1M
134 begin if (rom_data_rate_1[393-x]) //250+143
135 begin
136 r<=10'h3ff;
137 g<=10'h000;
138 b<=10'h000;
139 end
140 else
141 begin
142 r<=10'h3ff;
143 g<=10'h3ff;
144 b<=10'h3ff;
145 end
146 end
147
148 else if (dis_rate_2) //显示:500K 200K 100K 10K
149 begin if (rom_data_rate_2[10'd545-x]) //402+143
150 begin
151 r<=10'h3ff;
152 g<=10'h000;
153 b<=10'h000;
154 end
155 else
156 begin
157 r<=10'h3ff;
158 g<=10'h3ff;
159 b<=10'h3ff;
160 end
161 end
162 else if (rate_select) //rate_select
163 begin
164 b<=10'h000;
165 g<=10'h000;
166 r<=10'h3ff;
167 end
168 else
169
170 begin
171 r<=10'h3ff;
172 g<=10'h3ff;
173 b<=10'h3ff;
174 end
175 /*************************************************/
176
177
178 /*************************************************/
179
180 assign rom_addr_rate=addr;
181 assign rom_addr_rate_1=addr_1;
182 assign rom_addr_rate_2=addr_2;
183 assign vga_r_rate=r;
184 assign vga_b_rate=b;
185 assign vga_g_rate=g;
186
187 /*************************************************/
188 endmodule


e、vga_control_wave

  1 module vga_control_wave  (clk_25m,rst_n,
2 vga_r_wave,vga_g_wave,vga_b_wave,
3 x,y,valid,
4 en_large,
5 move,
6 sfr_0,sfr_1,sfr_2,sfr_3,
7 data_ready
8 );
9
10 input clk_25m;
11 input rst_n;
12 input [9:0]x;
13 input[9:0]y;
14 input valid;
15 input en_large; //波形放大信号,为1是放大一倍
16 input move; //波形平移
17 input [63:0]sfr_0; //通道0的64位数据
18 input [63:0]sfr_1; //通道1的64位数据
19 input [63:0]sfr_2; //通道2的64位数据
20 input [63:0]sfr_3; //通道3的64位数据
21 input data_ready; //数据有效信号
22 output [9:0]vga_r_wave;
23 output [9:0]vga_g_wave;
24 output [9:0]vga_b_wave;
25 /*********************************************/
26
27
28 /*********************************************/
29 //放大信号,en_large=1:每个高电平或低电平为16个像素点
30 // en_large=0: 每个高电平或低电平为8个像素点
31 reg [4:0]cnt;
32 always @(posedge clk_25m)
33 if (en_large)
34 cnt<=5'd16;
35 else cnt<=5'd8;
36
37 //计数器
38 reg [5:0]count;
39 always @(posedge clk_25m or negedge rst_n)
40 if(!rst_n)
41 count<=5'b0;
42 else
43 if (!en_large)
44 begin if(count==5'd8)
45 count<=5'd1;
46 else
47 count<=count+1'b1;
48 end
49 else
50 begin if (count==5'd16)
51 count<=5'd1;
52 else
53 count<=count+1'b1;
54
55 end
56
57 /*********************************************/
58
59
60 /*********************************************/
61 //wave
62 wire ch_0_0,ch_0_1,
63 ch_1_0,ch_1_1,
64 ch_2_0,ch_2_1,
65 ch_3_0,ch_3_1;
66 assign ch_0_0=((y==10'd150)&(x>=10'd260 & x<=10'd 720));//通道0的高电平显示区域
67 assign ch_0_1=((y==10'd165)&(x>=10'd260 & x<=10'd 720));//通道0的低电平显示区域
68 assign ch_1_0=((y==10'd190)&(x>=10'd260 & x<=10'd 720));//通道1的高电平显示区域
69 assign ch_1_1=((y==10'd205)&(x>=10'd260 & x<=10'd 720));//通道1的低电平显示区域
70 assign ch_2_0=((y==10'd230)&(x>=10'd260 & x<=10'd 720));//通道2的高电平显示区域
71 assign ch_2_1=((y==10'd245)&(x>=10'd260 & x<=10'd 720));//通道2的低电平显示区域
72 assign ch_3_0=((y==10'd270)&(x>=10'd260 & x<=10'd 720));//通道3的高电平显示区域
73 assign ch_3_1=((y==10'd285)&(x>=10'd260 & x<=10'd 720));//通道3的低电平显示区域
74
75 /*********************************************/
76
77
78 /*********************************************/
79 //有效数据
80 reg [63:0]sfr;
81 always @(posedge clk_25m or negedge rst_n)
82 if (!rst_n)
83 begin
84 sfr<=1'b0;
85 end
86 else if (y>=150 &&y<=165) //第0通道数据
87 sfr<=sfr_0;
88 else if (y>=190 && y<=205) //第1通道数据
89 sfr<=sfr_1
90 else if (y>=230 && y<=245) //第2通道数据
91 sfr<=sfr_2;
92 else if (y>=270 && y<=285) //第3通道数据
93 sfr<=sfr_3;
94 else sfr<=1'b0;
95
96 /*********************************************/
97
98
99 /*********************************************/
100 //data
101
102 reg [5:0]c;
103 always @(posedge clk_25m )
104 if(move==1'b0)
105 begin
106 if (x==260)
107 c<=6'b000000;
108 else if (count==cnt)
109 c<=c+1'b1;
110 end
111 else
112 begin
113 if(x==260)
114 c<=6'd32;
115 else if (count==cnt)
116 c<=c+1'b1;
117 end
118 /**************************************************/
119
120
121
122 /**************************************************/
123 reg [9:0]r;
124 reg [9:0]g;
125 reg [9:0]b;
126
127 always @ (posedge clk_25m or negedge rst_n)
128 if (!rst_n)
129 begin
130 r<=10'd0;
131 g<=10'd0;
132 b<=10'd0;
133 end
134 else if(!valid) begin
135 r<=10'd0;
136 g<=10'd0;
137 b<=10'd0;
138 end
139 else if (data_ready==1'b0)
140 begin
141 r<=10'd0;
142 g<=10'd0;
143 b<=10'd0;
144 end
145 else if((x>=260)&&(x<=720)&&(count==cnt)&& //显示波形之间的竖线
146 ((y>=10'd150&&y<=10'd165)||
147 (y>=10'd190 &&y<=10'd205)||
148 (y>=10'd230 && y<=10'd245)||
149 (y>=10'd270 && y<=10'd285))
150 & (sfr[c]^sfr[c+1]) )
151 begin
152 b<=10'h3ff;
153 g<=10'h000;
154 r<=10'h000;
155 end
156
157 else if ( ch_0_0||ch_1_0 ||ch_2_0 || ch_3_0 ) //显示4个通道的高电平
158 begin
159 if ( sfr[c])
160
161 begin b<=10'h3ff;
162 g<=10'h000;
163 r<=10'h000;
164 end
165 else begin
166 r<=10'h3ff;
167 g<=10'h3ff;
168 b<=10'h3ff;
169 end
170 end
171
172 else if (ch_0_1||ch_1_1 ||ch_2_1 || ch_3_1 & (c>=0 &c<=63)) //显示4个通道的低电平
173 begin
174 if ( sfr[c]==1'b0)
175
176 begin b<=10'h3ff;
177 g<=10'h000;
178 r<=10'h000;
179 end
180 else begin
181 r<=10'h3ff;
182 g<=10'h3ff;
183 b<=10'h3ff;
184 end
185
186 end
187
188 else
189 begin
190 r<=10'h3ff;
191 g<=10'h3ff;
192 b<=10'h3ff;
193 end
194
195 /******************************************************/
196
197
198 /*******************************************************/
199 assign vga_r_wave=r;
200 assign vga_g_wave=g;
201 assign vga_b_wave=b;
202
203 /*******************************************************/
204
205
206 /*******************************************************/
207 endmodule
208
209
210
211
212


f、顶层文件:

  1 module vga (vga_clk,rst_n,hsync,vsync,sync_n,blank_n,vga_r,vga_b,vga_g,mode,rate,
2 ch0_tri,ch1_tri,ch2_tri,ch3_tri,en_large,move,
3 sfr_0,sfr_1,sfr_2,sfr_3,data_ready
4 );
5 input vga_clk;
6 input rst_n;
7 input [1:0]mode; //模式选择
8 input [3:0]rate; //采样频率选择
9 input ch0_tri; //0通道触发选择
10 input ch1_tri; //1通道触发选择
11 input ch2_tri; //2通道触发选择
12 input ch3_tri; //3通道触发选择
13 input data_ready; //数据有效信号
14 input en_large; //波形放大信号
15 input move; //波形平移信号
16 input [63:0]sfr_0; //采样出来的通道0的64位数据
17 input [63:0]sfr_1; //采样出来的通道1的64位数据
18 input [63:0]sfr_2; //采样出来的通道2的64位数据
19 input [63:0]sfr_3; //采样出来的通道3的64位数据
20 output hsync; //列同步信号
21 output vsync; //行同步信号
22 output sync_n; //同步信号
23 output blank_n; //blank信号
24 output [9:0]vga_r;
25 output [9:0]vga_g;
26 output [9:0]vga_b;
27
28 /********************************************/
29
30 /********************************************/
31 //同步信号和blank信号
32 assign sync_n=1'b0;
33 assign blank_n=hsync && vsync;
34
35 /********************************************/
36
37 /********************************************/
38 //同步模块,用于控制显示标准和x,y坐标和有效区域
39 wire valid;
40 wire [9:0]x;
41 wire [9:0]y;
42 wire hsync_1,vsync_1;
43 sync_module U2(
44 .clk_25m(vga_clk),
45 .rst_n(rst_n),
46 .valid(valid),
47 .x(x),
48 .y(y),
49 .hsync_1(hsync_1),
50 .vsync_1(vsync_1));
51
52
53 /********************************************/
54
55 /********************************************/
56 //topic
57 //控制“DIY 逻辑分析仪”的显示
58 wire [7:0] rom_addr_topic;
59 wire [31:0]rom_data_topic;
60 wire [9:0]vga_r_topic;
61 wire [9:0]vga_g_topic;
62 wire [9:0]vga_b_topic;
63
64 vga_rom_topic U3 (
65 .address ( rom_addr_topic ),
66 .clock ( vga_clk ),
67 .q ( rom_data_topic)
68 );
69
70
71
72
73 vga_control_topic U4 (
74 . clk_25m(vga_clk),
75 .rst_n(rst_n),
76 .vga_r_topic(vga_r_topic),
77 .vga_g_topic(vga_g_topic),
78 .vga_b_topic(vga_b_topic),
79 .x(x),
80 .y(y),
81 .valid(valid),
82 .rom_addr_topic(rom_addr_topic),
83 .rom_data_topic(rom_data_topic)
84 );
85
86 /********************************************/
87
88 /********************************************/
89 //channel
90 //通道的显示的控制
91 wire [4:0] rom_addr_num_0;
92 wire [7:0] rom_data_num_0;
93 wire [4:0]rom_addr_num_1;
94 wire [7:0]rom_data_num_1;
95 wire [4:0]rom_addr_num_2;
96 wire [7:0]rom_data_num_2;
97 wire [4:0]rom_addr_num_3;
98 wire [7:0]rom_data_num_3;
99 rom_num_0 U5 (
100 .address(rom_addr_num_0),
101 .clock(vga_clk),
102 .q(rom_data_num_0)
103 );
104
105 rom_num_1 U6 (
106 .address(rom_addr_num_1),
107 .clock(vga_clk),
108 .q(rom_data_num_1)
109 );
110
111 rom_num_2 U7 (
112 .address(rom_addr_num_2),
113 .clock(vga_clk),
114 .q(rom_data_num_2)
115
116 );
117 rom_num_3 U8 (
118 .address(rom_addr_num_3),
119 .clock(vga_clk),
120 .q(rom_data_num_3)
121
122 );
123
124 wire [31:0]rom_data_ch;
125 wire[4:0]rom_addr_ch;
126 wire [9:0]vga_r_ch;
127 wire [9:0]vga_g_ch;
128 wire [9:0]vga_b_ch;
129 char_rom U9 (
130 .address ( rom_addr_ch ),
131 .clock ( vga_clk ),
132 .q ( rom_data_ch )
133 );
134 vga_control_ch U10 (
135 .clk_25m(vga_clk),
136 .rst_n(rst_n),
137 .vga_r_ch(vga_r_ch),
138 .vga_g_ch(vga_g_ch),
139 .vga_b_ch(vga_b_ch),
140 .x(x),
141 .y(y),
142 .valid(valid),
143 .rom_data_ch(rom_data_ch),
144 .rom_addr_ch(rom_addr_ch),
145 .rom_addr_num_0(rom_addr_num_0),
146 .rom_data_num_0(rom_data_num_0),
147 .rom_addr_num_1(rom_addr_num_1),
148 .rom_data_num_1(rom_data_num_1),
149 .rom_addr_num_2(rom_addr_num_2),
150 .rom_data_num_2(rom_data_num_2),
151 .rom_addr_num_3(rom_addr_num_3),
152 .rom_data_num_3(rom_data_num_3)
153 );
154
155 /********************************************/
156
157 /********************************************/
158 //mode
159 //采样模式的控制
160 wire [4:0]rom_addr_mode;
161 wire [79:0]rom_data_mode;
162 wire [9:0]vga_r_mode;
163 wire [9:0]vga_g_mode;
164 wire [9:0]vga_b_mode;
165 rom_mode U11 (
166 .address(rom_addr_mode),
167 .clock(vga_clk),
168 .q(rom_data_mode)
169 );
170
171 vga_control_mode U12 (
172 .clk_25m(vga_clk),
173 .rst_n(rst_n),
174 .vga_r_mode(vga_r_mode),
175 .vga_g_mode(vga_g_mode),
176 .vga_b_mode(vga_b_mode),
177 .x(x),
178 .y(y),
179 .valid(valid),
180 .mode(mode),
181 .rom_data_mode(rom_data_mode),
182 .rom_addr_mode(rom_addr_mode)
183 );
184
185 /********************************************/
186
187 /********************************************/
188 //trigger
189 //触发模式的控制
190 wire [4:0]addr_0;
191 wire [4:0]addr_1;
192 wire [7:0] data_0;
193 wire [7:0] data_1;
194 rom_num_0 U13 (
195 .address(addr_0),
196 .clock(vga_clk),
197 .q(data_0)
198 );
199
200 rom_num_1 U14 (
201 .address(addr_1),
202 .clock(vga_clk),
203 .q(data_1)
204 );
205 wire[4:0]rom_addr_tr;
206 wire [79:0]rom_data_tr;
207 wire [9:0]vga_r_tr;
208 wire [9:0]vga_g_tr;
209 wire [9:0]vga_b_tr;
210 rom_trigger U15 (
211 .address(rom_addr_tr),
212 .clock(vga_clk),
213 .q(rom_data_tr)
214 );
215 vga_control_trigger U16 (
216 .clk_25m(vga_clk),
217 .rst_n(rst_n),
218 .vga_r_tr(vga_r_tr),
219 .vga_g_tr(vga_g_tr),
220 .vga_b_tr(vga_b_tr),
221 .x(x),
222 .y(y),
223 .valid(valid),
224 .rom_data_tr(rom_data_tr),
225 .rom_addr_tr(rom_addr_tr),
226 .addr_0(addr_0),
227 .data_0(data_0),
228 .addr_1(addr_1),
229 .data_1(data_1),
230 .ch0_tri(ch0_tri),
231 .ch1_tri(ch1_tri),
232 .ch2_tri(ch2_tri),
233 .ch3_tri(ch3_tri)
234 );
235 /********************************************/
236
237 /********************************************/
238 //rate
239 //采样频率的控制
240 wire [4:0]rom_addr_rate_1;
241 wire [143:0]rom_data_rate_1;
242 wire [9:0]vga_r_rate;
243 wire [9:0]vga_g_rate;
244 wire [9:0]vga_b_rate;
245 rom_rate_1 U17 (
246 .address(rom_addr_rate_1),
247 .clock(vga_clk),
248 .q(rom_data_rate_1)
249 );
250
251 wire [4:0]rom_addr_rate_2;
252 wire [143:0]rom_data_rate_2;
253 rom_rate_2 U18 (
254 .address(rom_addr_rate_2),
255 .clock(vga_clk),
256 .q(rom_data_rate_2)
257 );
258
259
260 wire[4:0]rom_addr_rate;
261 wire [79:0]rom_data_rate;
262 rom_samp U19 (
263 .address(rom_addr_rate),
264 .clock(vga_clk),
265 .q(rom_data_rate)
266 );
267
268 vga_control_rate U20 (
269 .clk_25m(vga_clk),
270 .rst_n(rst_n),
271 .vga_r_rate(vga_r_rate),
272 .vga_g_rate(vga_g_rate),
273 .vga_b_rate(vga_b_rate),
274 .x(x),
275 .y(y),
276 .valid(valid),
277 .rom_addr_rate(rom_addr_rate),
278 .rom_data_rate(rom_data_rate),
279 .rom_addr_rate_1(rom_addr_rate_1),
280 .rom_data_rate_1(rom_data_rate_1),
281 .rom_addr_rate_2(rom_addr_rate_2),
282 .rom_data_rate_2(rom_data_rate_2),
283 .rate(rate)
284 );
285 /********************************************/
286
287 /********************************************/
288 //wave
289 //波形的控制
290 wire [9:0] vga_r_wave;
291 wire [9:0] vga_g_wave;
292 wire [9:0] vga_b_wave;
293 vga_control_wave U22 (
294 .clk_25m(vga_clk),
295 .rst_n(rst_n),
296 .vga_r_wave(vga_r_wave),
297 .vga_g_wave(vga_g_wave),
298 .vga_b_wave(vga_b_wave),
299 .x(x),
300 .y(y),
301 .valid(valid),
302 .sfr_0(sfr_0),
303 .sfr_1(sfr_1),
304 .sfr_2(sfr_2),
305 .sfr_3(sfr_3),
306 .en_large(en_large),
307 .move(move),
308 .data_ready(data_ready)
309 );
310
311
312 /**************************************/
313
314
315
316
317
318
319 /*****************************************/
320 //每个模块的颜色叠加在一起
321 assign vga_r=vga_r_topic & vga_r_wave & vga_r_mode & vga_r_tr & vga_r_ch & vga_r_rate;
322 assign vga_g=vga_g_topic & vga_g_wave & vga_g_mode & vga_g_tr & vga_g_ch & vga_g_rate;
323 assign vga_b=vga_b_topic & vga_b_wave & vga_b_mode & vga_b_tr & vga_b_ch & vga_b_rate;
324
325 /*****************************************/
326
327
328 /*****************************************/
329 //同步模块的延迟的控制,
330 reg [1:0]f1;
331 reg [1:0]f2;
332 reg [1:0]f3;
333 always @ (posedge vga_clk or negedge rst_n)
334 if (!rst_n)
335 begin f1<=1'b1;
336 f2<=1'b1;
337 f3<=1'b1;
338 end
339 else
340 begin
341 f1<={hsync_1,vsync_1};
342 f2<=f1;
343 f3<=f2;
344 end
345
346
347 /*****************************************/
348
349
350 /*****************************************/
351 assign {hsync,vsync}=f3;
352 /*****************************************/
353
354
355
356 endmodule

结果显示:


上图采用的采样模式为模式一:显示触发后64位数据。触发模式为1000:通道0上升沿触发,其他3个通道下降沿触发。采样频率位500M。

原文地址:https://www.cnblogs.com/tony1224/p/2269735.html