• 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。

  • 相关阅读:
    WP开发笔记——页面传参
    WP开发笔记——控件倾斜效果
    WP开发笔记——不同Item显示不同ApplicationBar:适用于Pivot与Panorama
    WP开发笔记——WP APP添加页面跳转动画
    WP开发笔记——去除 HTML 标签
    WP开发笔记——字符串 转 MD5 加密
    WP开发笔记——WP7 SDK使用技巧
    sphinx,coreseek安装
    yii2从零开始一,安装
    array_filter函数
  • 原文地址:https://www.cnblogs.com/tony1224/p/2269735.html
Copyright © 2020-2023  润新知