FPGA即插即用Verilog驱动系列——高速12位ADC

发布于:2025-08-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

实现功能:

  1. 单通道ADC驱动,速率由驱动的时钟决定
  2. 12位数据并行,可轻松修改为其他位宽,适应不同的ADC模块
  3. 将ADC输入的unsigned数据转换为signed,便于后续FIR,MULTI操作
  4. 匹配AXI4-STREAM协议,有tvalid输出,便于和vivado标准IP连接,不需要也可以删掉
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/07/17 18:12:32
// Design Name: 
// Module Name: AD_in_single
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
//   这是一个可复用的、处理单通道ADC的接口模块。
//   1. 为单个ADC通道提供一个时钟输出。
//   2. 接收来自单个ADC通道的12位并行数据。
//   3. 使用2级同步器将数据安全地跨时钟域同步到FPGA系统时钟。
//   4. **将无符号的偏移二进制码转换为有符号的二进制补码。**
//   5. 将处理后的有符号数据通过独立的12位端口输出。
//
// Dependencies: 
// 
// Revision:
// Revision 1.0 - 从双通道版本拆分而来,实现了模块化和可复用性。
// Revision 1.1 - 增加了无符号到有符号的转换逻辑。
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module AD_in_single(
    // =================== 系统接口 ===================
    input                aclk,    // FPGA系统主时钟 (例如 2MHz)
    input                aresetn, // 低电平有效复位

    // =================== ADC物理接口 ===================
    output               adc_clk_out,     // 提供给ADC芯片的时钟
    input       [11:0]   adc_data_in,     // 来自ADC通道的12位数据 (假定为偏移二进制码)

    // =================== 输出数据接口 ===================
    output signed [11:0] m_axis_data_out,      // **已修改**: 输出12位有符号数据
    output               m_axis_data_out_tvalid  // 数据有效信号
    );

// =================================================================
// 内部信号定义
// =================================================================
// --- 2级同步器寄存器 ---
// 用于将来自ADC的数据安全地同步到FPGA的aclk时钟域
reg [11:0] data_sync1, data_sync2;
reg        tvalid_reg;   // tvalid信号的寄存器版本

// --- 新增: 用于存储转换后有符号数据的线网 ---
wire signed [11:0] signed_data;

// =================================================================
// 逻辑实现
// =================================================================

// 1. 为ADC提供时钟
assign adc_clk_out = aclk;

// 2. 输入数据跨时钟域同步
always @(posedge aclk) begin
    data_sync1 <= adc_data_in;
    data_sync2 <= data_sync1;
end

// 3. **新增**: 无符号到有符号转换 (组合逻辑)
//    假定输入的adc_data_in是范围从0到4095的偏移二进制码。
//    减去中间值2048 (2^11) 即可将其转换为范围从-2048到2047的二进制补码。
assign signed_data = data_sync2 - 12'd2048;

// 4. 输出tvalid信号生成
always @(posedge aclk or negedge aresetn) begin
    if (!aresetn) begin
        tvalid_reg <= 1'b0;
    end else begin
        tvalid_reg <= 1'b1;
    end
end

// 5. 数据输出
//    输出经过同步和格式转换后的、稳定的有符号数据。
assign m_axis_data_out        = signed_data;
assign m_axis_data_out_tvalid = tvalid_reg;

endmodule


网站公告

今日签到

点亮在社区的每一天
去签到