⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.v

📁 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 + -