1. 概述

adc_ltc2308_fifo.v模块是一个用于控制 LTC2308 ADC芯片 的 FPGA 模块,通过 Avalon MM总线与Nios II软核通信。其核心功能是:
  1. 配置ADC参数(如通道选择、采样次数)。
  2. 触发ADC采样,并将数据存入 FIFO。
  3. 通过总线读取FIFO中的采样数据。

2. Avalon MM接口

Avalon MM接口(Avalon Memory Mapped Interface)是一种在FPGA内部或FPGA与外部设备之间进行存储器映射的读写操作的总线接口协议。

1.主要特点

  • 存储器映射访问:采用存储器映射的方式,所有的外围设备都被映射到一个统一的地址空间中,主设备可以通过地址对从设备进行读写操作。
  • 主从架构:遵循主设备(Master)和从设备(Slave)的架构,主设备发起读写请求,从设备响应请求。
  • 主要信号包括地址、数据、读写控制信号和等待请求信号等。
  • 支持多种数据宽度:数据总线宽度可以根据需求配置,支持8位、16位、32位、64位等多种宽度,提供设计灵活性。
  • 支持突发传输和流水线操作:提高了数据传输的效率和系统的吞吐量。

2.基本信号

  • Address(地址):主设备发出的目标地址,用于选择从设备和指定访问的寄存器或存储单元。
  • Read(读请求):高电平表示读操作,指示从设备将数据放在读数据线上。
  • Write(写请求):高电平表示写操作,主设备将在写数据线上提供数据。
  • Read Data(读数据):从设备返回的数据。
  • Write Data(写数据):主设备发送给从设备的数据。

更详细的内容可以参考笔记 Altera FPGA 的 Avalon总线接口规范

3. adc_ltc2308_fifo模块引脚定义

adc_ltc2308_fifo模块的RTL 视图如下:

 

 
其信号定义如下: 
信号
方向
位宽
描述
slave_clk
输入
1
总线时钟,所有端口信号都同步于该时钟信号
slave_reset_n
输入
1
 复位信号
slave_chipselect_n
输入
1
 片选信号,当该信号有效时,IP 核的所有寄存器才能被访问
slave_addr
输入
1
地址,该地址信号指定了 IP 核被访问的寄存器编号,通过给该信号赋予不同的值,就能选择访问不
同的寄存器
slave_read_n
输入
1
读请求信号,低电平有效,当该信号有效(低电平)时, address 指定的寄存器中的数据会被送到readdata 端口读出
slave_write_n
输入
1
写请求信号,低电平有效,当该信号有效(低电平)时,writedata 端口上的数据会被写入 address 指
定的寄存器中
slave_readdata
输出
16
读数据端口,当 slave_chipselect_n和slave_read_n 有效时,该端口上的值为 address 指定的寄存器中的值
slave_writedata
输入
16
写数据信号,当 slave_chipselect_n和slave_wrtie_n 信号有效时,该端口上的数据会被写入 address 指定的寄存器中
adc_clk
输入
1
 40MHz
ADC_CONVST
输出
1
  标记出 measure_start 信号高电平
ADC_SCK
输出
1
 LTC2308的SCK时钟
ADC_SDI
输出
1
 LTC2308的SDI控制字
ADC_SDO
输入
1
 采集的数据
adc_ltc2308_fifo.v模块里面例化了adc_ltc2308.v模块(关于该模块的功能解读请参考:3-LTC2308控制器设计——adc_ltc2308.v模块代码解读)和adc_data_fifo.v模块。 

 

下面来一一解读adc_ltc2308_fifo.v模块的代码。

4. 寄存器写操作控制

根据地址和控制信号,将写入数据存储到相应的寄存器中。当地址信号为0时,将写总线上的数据寄存到通道选择的寄存器measure_fifo_ch和启动转换标志的寄存器measure_fifo_start当中;当地址信号为1时,将写总线上的数据寄存到采样次数的寄存器measure_fifo_num当中。

 

5. 寄存器读操作控制

根据地址和控制信号,将转换状态寄存器measure_fifo_done的值输出到读数据端口:

 根据地址和控制信号,将FIFO缓存的数据读出(fifo_q)并传输给读数据端口:

 
3. 生成ADC复位信号
由应用程序传递启动信号0、1、0给measure_fifo_start寄存器。由measure_fifo_start生成ADC复位信号,当测量开始时复位ADC。
0
 

6. 控制测量过程的启动、进行和结束

 复位时, config_first 被置为 1,表示系统处于首次配置状态。
离开复位状态后将measure_start置1开始让adc_ltc2308模块执行一次测量任务。第一次测量(config_first =1)不计入测量次数。
第二次测量结束,measure_count为1;
第三次测量结束,measure_count为2;
第四次测量结束,measure_count为3;
第五次测量结束,measure_count为4;
第六次测量结束,measure_count为5;
第七次测量结束,measure_count为6;
第八次测量结束,measure_count为7;
第九次测量结束,measure_count为8;
第十次测量结束,measure_count为9;
第十一次测量结束,measure_count为10,measure_fifo_done为1, 结束11次测量。
0

 

 打开~DE10_Standard_ADC\stp2.stp 文件(关于Signaltap调试工具的使用请参考推文),采样时钟设置的是PLL outclk_0输出的100M,ADC_CONVST作为触发信号:

 

 

 

7. FIFO读操作控制

读操作延迟一个时钟周期:

 

所以这里对slave_read_data再打一拍,然后进行判断:

 

8. FIFO写操作控制 

每次转换完成后将数据写入 FIFO,但第一次转换的数据丢弃,不写入FIFO。

9. adc_data_fifo.v模块设置 

FIFO位宽设置为12bit,深度设置为2048个word。设置异步读写时钟。
0
 
 

往期推荐阅读: