[Verilog]ADC0809驱动程序
- ADC0809芯片双通道轮询采样
- Xilinx basys2 100E 测试通过
- FPGA
相较于原程序,修改了一部分时序,添加了多通道采集,以及输出。
`timescale 1ns / 1ps
module ADC0809 ( rst ,clk ,D ,EOC ,ale ,OE ,start ,clk_out ,an ,ane ,reg1, reg2, addr_ad);
//in from AD
input rst ; //系统 复位
input clk ; //系统时钟
// input [2:0] abc_in ; //外部控制的通道选择信号
input [7:0] D ; //ADC0809传进来的数据
input EOC ; //ADC0809转换完成信号标志
//out for AD
output ale ; //FPGA给ADC0809的地址锁存信号
output OE ; //FPGA给ADC0809的使能信号
output start ; //ADC0809 转换开始信号
output clk_out; //FPGA给ADC0809的时钟信号
output addr_ad ; //FPGA给ADC0809的通道选择信号
//out for other module
//output addr_om ; //FPGA给其他模块的地址信号
output [7:0] an; //数码管段码
output [3:0] ane; //数码管使能
output [7:0] reg1 ;
output [7:0] reg2;
fclkout A1(clk,rst,clk_out);
adc0809inout A2(rst,clk,D,EOC,ale,OE,start,addr_ad,reg1,reg2);
display A3(clk,rst,reg1,reg2,an,ane);
endmodule
///AD--750kHz时钟输出
module fclkout(clk,rst,clk_out);
input clk;
input rst;
output clk_out;
reg clkoutsign;
reg [5:0] clkoutf ;
assign clk_out = clkoutsign;
always @ (posedge clk or posedge rst) //AD--750kHz时钟输出
begin
if ( rst== 1'b1 ) begin //复位
clkoutf<=0;
clkoutsign<=0;
end
else begin //分频
clkoutf <= clkoutf + 1;
if ( clkoutf >= 6'b10_1000 ) begin
clkoutf <= 6'b00_0000;
clkoutsign<=~clkoutsign;
end
end
end
endmodule
时序状态转换
module adc0809inout(rst,clk,D,EOC,ale,OE,start,addr_ad,reg1,reg2);
//状态转换标志位
//in from AD
input rst ; //系统 复位
input clk ; //系统时钟
input [7:0] D ; //ADC0809传进来的数据
input EOC ; //ADC0809转换完成信号标志
//out for AD
output ale ; //FPGA给ADC0809的地址锁存信号
output OE ; //FPGA给ADC0809的使能信号
output start ; //ADC0809 转换开始信号
output addr_ad ; //FPGA给ADC0809的通道选择信号
output [7:0] reg1;
output [7:0] reg2;
parameter st0 = 3'b000,
st1 = 3'b001,
st2 = 3'b010,
st3 = 3'b011,
st4 = 3'b100,
st5 = 3'b101,
st6 = 3'b110 ;
reg [2:0] p_state ; //状态转换
reg [2:0] n_state ;
reg