实现功能:
- 单通道ADC驱动,速率由驱动的时钟决定
- 12位数据并行,可轻松修改为其他位宽,适应不同的ADC模块
- 将ADC输入的unsigned数据转换为signed,便于后续FIR,MULTI操作
- 匹配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