📄 adc.v
字号:
/******************************************************************************
**模块名称:ADC
**模块功能:例化MY_ADC模块和PLL模块,并对ACM进行配置,控制ADC完成采样
******************************************************************************/
//定义配置数据功能位定义(电压,电流,温度)
//位0——2
`define PreScaler8V 8'h01
//位3——4
`define AnalogSEL_PreScaler 8'h00
//位5
`define DirDigital_OFF 8'h00
//位6
`define AnalogPositive 8'h00
//位7
`define PreScaler_ON 8'h80
//定义监控的通道常数
`define AVx 0
//输出到ADC的通道号常数
`define VoltageChanel 1+3*`AVx
//定义各个监控对象在ACM中的配置寄存器地址
`define ACMADDR_Voltage 1+4*`AVx
//定义各个监控对象在ACM中的配置数据
`define ACMDATA_Voltage `PreScaler8V+`AnalogSEL_PreScaler+`DirDigital_OFF+`AnalogPositive+`PreScaler_ON
module ADC (
PRESET,
CLK_48M,
VAREF,
AV0,
ADCSTART,
SAMPLE,
BUSY,
DATAVALID,
Chanel,
AD_OUT,
LED_OVER_1V,
LED_OVER_2V,
LED_OVER_3V,
LED_OVER_4V
);
input AV0; //模拟电压输入管脚
input PRESET,CLK_48M; //复位和时钟信号
output [4:0] Chanel; //ADC采样通道,仅测试用
output [11:0] AD_OUT; //ADC转换结果
output VAREF; //ADC参考电压
output DATAVALID; //ADC转化数据有效
output BUSY; //忙信号
output ADCSTART; //启动ADC转换
output SAMPLE; //采样进行标志信号
output LED_OVER_1V; //电压高于1v标志信号
output LED_OVER_2V; //电压高于2v标志信号
output LED_OVER_3V; //电压高于3v标志信号
output LED_OVER_4V; //电压高于4v标志信号
reg [7:0] ACMWDATA; //ACM写数据线
reg [7:0] ACMADDR; //ACM读数据线
reg ACMWEN; //ACM写使能
reg ACM_CONFIG; //ACM配置完成标志位
reg [4:0] CHNUMBER; //模拟输入通道选择
reg [4:0] Chanel;
reg [11:0] AD_OUT;
reg ADCSTART;
reg ACM_STATE;
wire[11:0] ADC_RESULT;
parameter CONFIG_Voltage = 1'd0,
CONFIG_OK=1'd1;
reg [1:0] ADC_STATE;
parameter CHECK_CONFIG = 2'd0,
SAMPLE_Voltage = 2'd1,
SAMPLE_Voltage_delay=2'd2,
SAMPLE_OK=2'd3;
//例化PLL模块
pllclk PLL_0(
.POWERDOWN(1'b1),
.CLKA(CLK_48M),
.GLA(CLK_24M),
.GLB(CLK_2M),
.OADIVRST(1'b1)
);
//例化ADC模块
MY_ADC MY_ADC_0(
.SYS_CLK(CLK_24M),
.SYS_RESET(~PRESET),
.VAREF(VAREF),
.DATAVALID(DATAVALID),
.AV0(AV0),
.INIT_ADDR(ACMADDR),
.INIT_DATA(ACMWDATA),
.INIT_ACM_WEN(ACMWEN),
.ADCSTART(ADCSTART),
.ADCRESET(0),
.PWRDWN(1'b0),
.MODE(4'b0101),
.VAREFSEL(1'b0),
.STC(8'h00),
.TVC(8'h00),
.CHNUMBER(CHNUMBER),
.CALIBRATE(CALIBRATE),
.BUSY(BUSY),
.SAMPLE(SAMPLE),
.ADC_RESULT(ADC_RESULT),
.ACMCLK(CLK_2M)
);
//ACM状态机,配置ACM寄存器
always@(posedge CLK_2M or posedge PRESET)
begin
if(PRESET)
begin
ACM_STATE <= CONFIG_Voltage;
ACMWEN <= 0;
ACM_CONFIG <= 0;
end
else
begin
case(ACM_STATE)
CONFIG_Voltage:
begin
if(CALIBRATE==0) //等待ADC上电后校准结束
begin
ACMADDR <=`ACMADDR_Voltage; //通道号在ACM配置寄存器中的地址
ACMWDATA <=`ACMDATA_Voltage; //通道号的配置数据
ACMWEN <=1;
ACM_STATE<=CONFIG_OK;
end
end
CONFIG_OK:
begin
ACMWEN <=0;
ACM_CONFIG<=1;
end
default:ACM_STATE<=CONFIG_Voltage;
endcase
end
end
//ADC状态机,控制ADC采集
always@(posedge CLK_24M or posedge PRESET)
begin
if(PRESET)
begin
ADC_STATE<=CHECK_CONFIG;
ADCSTART<=0;
Chanel<=0;
end
else
begin
case(ADC_STATE)
CHECK_CONFIG:
begin
if(ACM_CONFIG==1)
begin
ADC_STATE<=SAMPLE_Voltage;
end
end
SAMPLE_Voltage:
begin
CHNUMBER <= `VoltageChanel;
ADCSTART <= 1; //启动ADC的一次转换
ADC_STATE <= SAMPLE_Voltage_delay;
end
SAMPLE_Voltage_delay:
begin
ADCSTART <= 0;
ADC_STATE <= SAMPLE_OK;
end
SAMPLE_OK:
begin
if((BUSY==0)&&(DATAVALID==1)) //等待输出有效数据
begin
AD_OUT <=ADC_RESULT; //锁存转换后的结果
Chanel <=`VoltageChanel; //锁存相应的采样通道号
ADC_STATE <=CHECK_CONFIG; //继续采样
end
end
default:ADC_STATE<=CHECK_CONFIG; //继续采样
endcase
end
end
assign LED_OVER_1V=(AD_OUT>512); //AD输出结果是否大于1V
assign LED_OVER_2V=(AD_OUT>1024); //AD输出结果是否大于2V
assign LED_OVER_3V=(AD_OUT>1536); //AD输出结果是否大于3V
assign LED_OVER_4V=(AD_OUT>2048); //AD输出结果是否大于4V
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -