實現功能:
- 單通道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) begindata_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) beginif (!aresetn) begintvalid_reg <= 1'b0;end else begintvalid_reg <= 1'b1;end
end// 5. 數據輸出
// 輸出經過同步和格式轉換后的、穩定的有符號數據。
assign m_axis_data_out = signed_data;
assign m_axis_data_out_tvalid = tvalid_reg;endmodule