(Verilog代码设计实现:十路逻辑分析仪设计验证)

一, 设计要求

1 了解逻辑分析仪原理

2 设计十路逻辑分析仪,设计编写采样的逻辑


二, 逻辑分析仪

所谓逻辑分析仪其功能为分析逻辑电路的一个电路仪器,我们前期利用的第三方仿真软件modesim也是对逻辑电路进行逻辑分析,modesim只是通过对设计模拟仿真来验证我们的设计逻辑,只是在理论的情况下通过波形观察各个信号之间的关系,不能真实反应实际电路的逻辑关系。如果要真实反应实际中电路的逻辑关系就需要用到逻辑分析仪(示波器)。

在开发过程中,验证电路首先要能够在理论情况下满足对应的电路逻辑要求,理论验证通过后再通过逻辑分析仪验证实际的电路逻辑。再不同的开发厂商都会在开发软件中集成逻辑分析仪,比如inter的signaltap ii,xinlins公司的 vivado软件集成的ila。

以signaltap ii采样界面为例,我们在进行应用时,处理将开发板以及下载文件连接好,还需要设置采样时钟,采样深度以及被采样信号,也开始设置采样条件等。

forum.jpg

1-11

我们设计十路逻辑分析仪:

要求:采样十路一位的信号,采样十路波形,采样时钟设置为80Mhz,采样率可调节,波形通过vga接口显示在显示器上,人机交互接口我们采用ps2键盘,数据缓存采样双端口ram,默认采样深度为1k(1024)。

forum.jpg

1-12

forum.jpg

1-13

对于写入缓存的数据wr_data我们可以直接让其等于被采样信号

写时钟信号就等于我们采样时钟

写地址变化由写使能和采样使能信号控制产生。

写使能如何控制产生?

我们定义产生一个开始采样的标识信号flag_run和停止采样的标识信号flag_stop;

开始采样的标识信号flag_run拉高的条件为输入信号run有效时拉高,停止采样的标识信号flag_stop有效时拉低flag_run。

利用判断写地址是否等于1023来控制flag_stop。等于1023时拉高flag_stop;

根据触发条件msel产生对应的触发信号,就需要将被采样信号寄存两个时钟周期,产生跳变沿的表示信号。上升沿s_ring[9:0],下降沿s_faling[9:0],双沿s_change[9:0]

需要定义两个被采样信号寄存器singal_r,singal_rr,

s_ring[9] = singal_r[9]&(!singal_rr[9]),

s_ring[8] = singal_r[9]&(!singal_rr[8]),

s_ring[7] = singal_r[9]&(!singal_rr[7]),

s_change = singal_r[9]^singal_rr[9],

s_faling[9] = !singal_r[9]&singal_rr[9],

定义一个判断信号是否满足设定的触发条件:flag_trig[9:0],根据触发条件msel,将对应的值给到flag_trig;

0:flag_trig = 11111_11111

1:flag_trig = singal_rr

2:flag_trig =! singal_rr

3:flag_trig = s_ring

4:flag_trig = s_faling

5:flag_trig = s_change

在定义一个触发成功的标志信号flag_trig_ok;通过判断触发条件信号flag_trig[chsel]其对应的采样使能信号clk_en有效时拉高标志信号flag_trig_ok。

利用标志信号flag_trig_ok和标识信号flag_run控制产生写使能信号,当标志信号flag_trig_ok和标识信号flag_run有效时,拉高写使能信号,标识信号flag_stop有效时拉低写使能信号。

波形显示控制模块wave_ctrl设计分析

采样的到波形信号我们是显示在电脑屏幕中,由于我们本次设计采样的信号是十位的,那么我们就需要在屏幕中划分十个区域进行每一路波形的显示。显示形式我们参考仿真软件Modesim波形显示界面。

forum.jpg

1-14

在仿真界面中我们可以看到有格栅线,黄色的标线,以及每个信号的波形变化。

划分十个区域时我们以vga接口显示区域行作为划分基准。我们以显示标准640*480作为设计标准。那么我们可以将每48行显示一个波形,每一组波形之间有间隔,我们在设计时也需要考虑间隔。我们设定每一组波形在48行的显示区域内中选择32行作为波形显示的区域,剩下的16行划分为两个部分,每一部分分为8行,这两个部分可以成为上间隔和下间隔。

forum.jpg

1-15

接下来我们考虑逻辑关系显示

波形显示主要显示跳变沿,高电平,低电平,我们规定从缓存器中读取的数据,如果为高电平(数值为1)我们就让波形显示在波形划分区域的正上方,如果为低电平,则显示在波形显示区域的正下方。

波形显示控制模块其对应的端口信息包含:

forum.jpg

1-16

rd_clk = clk;

rd_addr = pixel_x + offset;

时刻线(黄色标线)显示

我们定义一个时刻线有效的信号flag_mark,当像素点横坐标等于我们设置的标线值时将有效信号拉高,其表示方式为:flag_mark = (pixel_x == mark)?1:0;

波形显示格栅线逻辑,定义格栅线有效信号flag_grid,我们规定每间隔32列显示格栅。

flag_grid = (pixel_x [4:0] == 0)?1:0.

波形显示

根据我们设定的波形显示范围,我们可以定义每一路波形高点电平显示的行值参数。

第一路波形参数:高电平choh = 8 + 47 *0,低电平参数 chol = 39 + 48*0

第2路波形参数:高电平choh = 8 + 47 *1,低电平参数 chol = 39 + 48*1

......

第10路波形参数:高电平choh = 8 + 47 *9,低电平参数 chol = 39 + 48*9

定义一个波形显示寄存器flag_wave_ok[9:0],我们要显示波形的跳变沿,参考触发条件设计逻辑,我们需要定义两个寄存器rd_data_r,rd_data_rr,将从缓存器中读取的波形数据寄存两拍,再定义波形信号跳变沿有效信号flag_edge[9:0].

flag_edge[0] = (rd_data_r [0]^ rd_data_rr[0])?1:0

flag_edge[1] = (rd_data_r [1]^ rd_data_rr[1])?1:0

......

flag_edge[9] = (rd_data_r [9]^ rd_data_rr[9])?1:0


flag_wave_ok[0] =( ((pixel_y == choh)&&(rd_data_rr[0]))||((pixel_y == chol)&&(!rd_data_rr[0]))

||(flag_edge[0])&&(pixel_y >= choh)&&(pixel_y <= chol))?1:0;

flag_wave_ok[1] =( ((pixel_y == choh)&&(rd_data_rr[1]))||((pixel_y == chol)&&(!rd_data_rr[1]))

||(flag_edge[1])&&(pixel_y >= choh)&&(pixel_y <= chol))?1:0;


颜色数据控制逻辑

在时刻线flag_mark = 1时,vga_data= 8’b111_111_00;//黄色

在格栅线flag_grid = 1时,vga_data= 8’b000_000_00;//白色

在波形显示信号flag_wave_ok = 1时,vga_data= 8’b000_111_00;//绿色

在描述时,我们判断三个条件的先后顺序是:线判断时刻线,在时刻线有效时,颜色为黄色,无效时,判断波形线是否有效,如果有效,颜色为绿色,如果无效,判断格栅线是否有效,有效,颜色为白,无效黑。

对于vga驱动模块,我们只需要在有效显示区域内让vga_rgb信号等于vga_data,其他区域为黑色。同时我们要在vga驱动模块产生有效显示区域所有像素点的横纵坐标。


人机交互模块human_computer设计分析我们利用ps2键盘进行人机交互控制,产生对应的控制变量。需要产生的人机交互变量包含:采样运行变量run,采样率控制变量clk_en,触发条件变量msel,采样通道变量chsel,光标变量mark,波形偏移变量offset。