用VHDL语言设计一个A/D转换程序,A/D转换芯片采用TLC549

如题所述

这是个我一直用的代码,没问题。就是是VERILOG的,你自己改改吧
/**************************************************************************************************
** TLC549 AD转换器 verilog代码
**************************************************************************************************/

module adc(
clk,
rst_n,

adc_clk,
adc_data,
adc_cs_n,
rAdc_data

);

input clk; // 50MHz输入时钟
input rst_n; // 复位信号,低有效

input adc_data; // ADC芯片输出的数据
output adc_clk; // ADC芯片输入时钟
output adc_cs_n; // ADC芯片片选信号,低有效
output[7:0] rAdc_data;
reg start_adc;

/*************************************************************************************************/
reg[10:0] clk_cnt; // clk计数器
wire cs_n_valid1;
wire cs_high;
wire cs_n_valid2;
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin clk_cnt <= 11'd0;start_adc<=1;end
else if (start_adc)
clk_cnt <= clk_cnt + 1'b1;

/*
** 完成一次转换需要75+8*64+850+75+8*64=2024个时钟周期
** adc_cs_n建立时间为75个时钟周期1.5us 转换时间保持高电平17us,即850个时钟周期
** adc_clk周期为系统时钟的64倍
*/
assign cs_n_valid1 = (clk_cnt > 11'd74) && (clk_cnt <= 11'd587);
assign cs_high = (clk_cnt > 11'd587) && (clk_cnt <= 11'd1437);
assign cs_n_valid2 = (clk_cnt > 11'd1512) && (clk_cnt <= 11'd2024);
//=================================================================================================
reg rAdc_cs;
always@(posedge clk or negedge rst_n)
if (!rst_n)
rAdc_cs <= 1'b1;
else if (start_adc) begin
rAdc_cs <= 1'b0;
if (cs_high)
rAdc_cs <= 1'b1;
else
rAdc_cs <= 1'b0;
end
assign adc_cs_n = rAdc_cs;
//=================================================================================================
reg [5:0] div_cnt; // 64分频计数器
reg rAdc_clk;
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
div_cnt <= 6'd0;
rAdc_clk <= 1'b0;
end
else if ((cs_n_valid1) || (cs_n_valid2)) begin
div_cnt <= div_cnt + 1'b1;
if (div_cnt < 32)
rAdc_clk <= 1'b1;
else
rAdc_clk <= 1'b0;
end
assign adc_clk = rAdc_clk;

//=================================================================================================
reg [7:0] rAdc_data;
always @(posedge clk or negedge rst_n)
if (!rst_n)
rAdc_data <= 8'd0;
else
case (clk_cnt)
11'd1513:rAdc_data[7] <= adc_data;
11'd1577:rAdc_data[6] <= adc_data;
11'd1641:rAdc_data[5] <= adc_data;
11'd1705:rAdc_data[4] <= adc_data;
11'd1769:rAdc_data[3] <= adc_data;
11'd1833:rAdc_data[2] <= adc_data;
11'd1897:rAdc_data[1] <= adc_data;
11'd1961:rAdc_data[0] <= adc_data;
default:rAdc_data[0] <= 1'b0;
endcase

endmodule
温馨提示:答案为网友推荐,仅供参考
相似回答