FPGA的AD芯片驱动
2013-06-01 22:44
423 查看
FPGA的AD芯片驱动
(2012-08-19 15:37:02)转载▼
标签:fpgaad芯片驱动it | 分类: FPGA学习笔记 |
//AD芯片驱动//作者:泪与汗的缠绵
module adc_ctrl(
clk,rst_n,
adc_data,adc_cs_n,adc_clk,
sys_cs_n,sys_rd_n,sys_rddata
);
input clk; //50MHz
input rst_n; //低电平复位信号
input adc_data; //TLC549数据信号
output adc_cs_n; //TLC549片选信号,低电平有效
output adc_clk; //TLC549时钟信号
input sys_cs_n; //总线读片选,低电平有效
input sys_rd_n; //总线读使能信号,低电平有效
output[7:0] sys_rddata; //总线读取数据
//---------------------------------------------------
//定时计数逻辑
reg[5:0] cntus; //1us计数器
always @(posedge clk or negedge rst_n)
if(!rst_n) cntus <= 6'd0;
else if((cntus < 6'd49) && (cstate != IDLE)) cntus <= cntus+1'b1;
else cntus <= 6'd0;
wire dchag_flag = (cntus == 6'd0); //ADC时钟下降沿标志位,高有效一个时钟周期
wire dlock_flag = (cntus == 6'd24); //ADC时钟上升沿标志位,高有效一个时钟周期
//---------------------------------------------------
//ADC工作状态机
parameter IDLE = 3'd0,
TSUDL = 3'd1,
START = 3'd2,
DTRAN = 3'd3,
STOP = 3'd4,
TWHDL = 3'd5;
reg[2:0] bitnum; //采样数据位寄存器7-0
reg[4:0] d17uscnt; //Twh延时计数器
reg[7:0] adc_dinr; //模数转换数据寄存器
reg[7:0] adc_dinlock; //模数转换数据寄存器,实时锁存
reg[2:0] cstate,nstate; //状态寄存器
//状态迁移
always @(posedge clk or negedge rst_n)
if(!rst_n) cstate <= IDLE;
else cstate <= nstate;
//数据采集位寄存器控制
always @(posedge clk or negedge rst_n)
if(!rst_n) bitnum <= 3'd0;
else if(nstate == IDLE) bitnum <= 3'd7;
else if((nstate == DTRAN) && dlock_flag) bitnum <= bitnum-1'b1;
//Twh延时计数器控制
always @(posedge clk or negedge rst_n)
if(!rst_n) d17uscnt <= 5'd0;
else if((nstate == TWHDL) && dchag_flag) d17uscnt <= d17uscnt+1'b1;
else if(nstate == IDLE) d17uscnt <= 5'd0;
//状态控制
always @(cstate or dchag_flag or bitnum or d17uscnt)
case(cstate)
IDLE: nstate <= TSUDL;
TSUDL: if(dchag_flag) nstate <= START;
else nstate <= TSUDL;
START: if(dchag_flag) nstate <= DTRAN;
else nstate <= START;
DTRAN: if(dchag_flag && (bitnum == 3'd7)) nstate <= STOP;
else nstate <= DTRAN;
STOP: if(dchag_flag) nstate <= TWHDL;
else nstate <= STOP;
TWHDL: if(dchag_flag && (d17uscnt == 5'd18)) nstate <= IDLE;
else nstate <= TWHDL;
default: nstate <= IDLE;
endcase
//数据锁存
always @(posedge clk or negedge rst_n)
if(!rst_n) adc_dinlock <= 8'h00;
else if((nstate == DTRAN) && dlock_flag) adc_dinlock[bitnum] <= adc_data; //数据锁存
always @(posedge clk or negedge rst_n)
if(!rst_n) adc_dinr <= 8'h00;
else if((nstate == STOP) && sys_rdcs_n) adc_dinr <= adc_dinlock;
assign adc_cs_n = ~((cstate == DTRAN) | (cstate == START) | (cstate == TSUDL));
//---------------------------------------------------
//时钟速率控制,1MHz
reg adc_clkr; //TLC549时钟信号寄存器
always @(posedge clk or negedge rst_n)
if(!rst_n) adc_clkr <= 1'b0;
else if((nstate == DTRAN) && (cntus > 5'd12)) adc_clkr <= 1'b1;
else adc_clkr <= 1'b0;
assign adc_clk = adc_clkr;
//---------------------------------------------------
//Avalon-MM接口逻辑
wire sys_rdcs_n = sys_cs_n | sys_rd_n;
reg sys_dlink; //数据输出控制,高电平有效
always @(posedge clk or negedge rst_n)
if(!rst_n) sys_dlink <= 1'b1;
else sys_dlink <= sys_rdcs_n; //锁存读片选译码
assign sys_rddata = sys_dlink ? 8'hzz:adc_dinr;
endmodule
相关文章推荐
- 用FPGA驱动DA芯片TLV5618
- 【龙印】龙芯1c上双路16位AD芯片TM7705的linux驱动
- D-Link DWA-125 (芯片rt3070)在linux下的驱动安装(Ad-hoc网络实验)
- Window XP驱动开发(十一) USB2.0 芯片CY7C68013A+FPGA实现的高速传输系统设计(软件及硬件)
- FPGA实现8080接口驱动TFL LCD屏(ILI9486芯片)
- FPGA驱动OLED动态显示(Verilog代码)——向OLED写数据(关键)
- Win7上USB转串口芯片ch341驱动安装方法
- mac摄像头的驱动成功与否,取决于摄像头的芯片的兼容性
- 【连载】【FPGA黑金开发板】NIOSII那些事儿--LCD驱动及图片显示(二十二)
- 移植UDA1341音频芯片驱动
- 芯片驱动越强越好吗?
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
- TLV5616(12位D/A转换芯片)单片机驱动
- FPGA调试之配置芯片电压设置
- FPGA+NIOS II 平台 DM9000最新驱动
- 初学Altera FPGA 之Altera USB-Blaster驱动安装
- 10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档
- Window XP驱动开发(十七) 芯片固件程序设计 (代码实现,针对USB2.0 芯片CY7C68013A)
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
- 基于FPGA的HDMI高清显示接口驱动