ADS7830 FPGA实现
ADS7830 FPGA实现
2012-05-11 11:18:12| 分类: 工作笔记 | 标签: |字号大中小 订阅
ADS7830是TI的一款8bit,8channel AD转换芯片,对应通过I2c接口进行配置和读;以下是我用verilog编写的程序,已经验证过了,完全ok,输入的时钟是125MHz。经过分频成200Khz,采用的I2c接口时钟是100Khz模式;这里为了给上层模块应用,将inout类型的Sda在上层模块处理了;
module I2c_ADS7830 #(parameter DIV_PARA = 625)( input clk, input rst_n, input AD_req, input[2:0] AD_channel, output reg dout_valid, output reg [7:0] dout, // output reg flag0, output reg scl, input sda_in, output reg sda_out, output reg en ); localparam HARD_ADDR = 8'b1001_0000; localparam I2C_IDLE = 4'd0,I2C_START = 4'd1,I2C_HADDR = 4'd2,I2C_HADDR_ACK = 4'd3, I2C_CMD = 4'd4,I2C_CMD_ACK = 4'd5,I2C_RESTART = 4'd6,I2C_WRADDR = 4'd7, I2C_WRADDR_ACK = 4'd8,I2C_RDATA = 4'd9,I2C_NACK = 4'd10,I2C_STOP = 4'd11;
reg[3:0] current_state; reg[2:0] AD_channel_buf; reg[7:0] databuf; reg[7:0] doutbuf;
reg i2c_clk; reg[9:0] div_cnt; reg[3:0] i2c_cnt;
reg start_AD; reg ack_AD; reg finish_AD; reg finish_AD_reg0,finish_AD_reg1;
//always@(posedge clk or negedge rst_n) //if(~rst_n) // flag0 <= 1'b0; //else if(finish_AD) // flag0 <= 1'b1; //reg en; //reg sda_reg; // //assign sda = en ? sda_reg : 1'bz;
always@(posedge clk or negedge rst_n) if(~rst_n) i2c_clk <= 1'b0; else if(div_cnt==DIV_PARA-1) i2c_clk <= ~i2c_clk;
always@(posedge clk or negedge rst_n) if(~rst_n) div_cnt <= 10'd0; else if(div_cnt==DIV_PARA-1) div_cnt <= 10'd0; else div_cnt <= div_cnt + 10'd1;
always@(posedge clk or negedge rst_n) if(~rst_n) AD_channel_buf <= 3'd0; else if(AD_req) AD_channel_buf <= AD_channel;
always@(posedge clk or negedge rst_n) if(~rst_n) start_AD <= 1'b0; else if(AD_req) start_AD <= 1'b1; else if(ack_AD) start_AD <= 1'b0;
always@(posedge clk or negedge rst_n) if(~rst_n) begin finish_AD_reg0 <= 1'b0; finish_AD_reg1 <= 1'b0; end else begin finish_AD_reg0 <= finish_AD; finish_AD_reg1 <= finish_AD_reg0; end
always@(posedge clk or negedge rst_n) if(~rst_n) dout_valid <= 1'b0; else if(finish_AD_reg0 & !finish_AD_reg1) dout_valid <= 1'b1; else dout_valid <= 1'b0;
always@(posedge clk or negedge rst_n) if(~rst_n) dout <= 8'd0; else if(dout_valid) dout <= doutbuf;
always@(posedge i2c_clk or negedge rst_n) if(~rst_n) ack_AD <= 1'b0; else if(start_AD) ack_AD <= 1'b1; else ack_AD <= 1'b0; always@(posedge i2c_clk or negedge rst_n) if(~rst_n) finish_AD <= 1'b0; else if(current_state == I2C_STOP) finish_AD <= 1'b1; else finish_AD <= 1'b0; always@(posedge i2c_clk or negedge rst_n) if(~rst_n) i2c_cnt <= 4'd0; else
case(current_state) I2C_HADDR,I2C_CMD, I2C_WRADDR,I2C_RDATA: begin if(i2c_cnt==4'd15) i2c_cnt <= 4'd0; else i2c_cnt <= i2c_cnt + 4'd1; end I2C_START,I2C_HADDR_ACK,I2C_CMD_ACK, I2C_WRADDR_ACK,I2C_NACK,I2C_STOP: begin if(i2c_cnt==4'd1) i2c_cnt <= 4'd0; else i2c_cnt <= i2c_cnt + 4'd1; end I2C_RESTART: begin if(i2c_cnt==4'd2) i2c_cnt <= 4'd0; else i2c_cnt <= i2c_cnt + 4'd1; end default:i2c_cnt <= 4'd0; endcase
always@(posedge i2c_clk or negedge rst_n) if(~rst_n) current_state <= I2C_IDLE; else case(current_state) I2C_IDLE: begin if(start_AD) current_state <= I2C_START; end I2C_START: begin if(i2c_cnt==4'd1) current_state <= I2C_HADDR; end I2C_HADDR: begin if(i2c_cnt==4'd15) current_state <= I2C_HADDR_ACK; end I2C_HADDR_ACK: begin if(scl && !sda_in) current_state <= I2C_CMD; else if(scl && sda_in) current_state <= I2C_IDLE; // if(scl) // current_state <= I2C_CMD; end I2C_CMD: begin if(i2c_cnt==4'd15) current_state <= I2C_CMD_ACK; end I2C_CMD_ACK: begin if(scl && !sda_in) current_state <= I2C_RESTART; else if(scl && sda_in) current_state <= I2C_IDLE; // if(scl) // current_state <= I2C_RESTART; end I2C_RESTART: begin if(i2c_cnt==4'd2) current_state <= I2C_WRADDR; end I2C_WRADDR: begin if(i2c_cnt==4'd15) current_state <= I2C_WRADDR_ACK; end I2C_WRADDR_ACK: begin if(scl && !sda_in) current_state <= I2C_RDATA; else if(scl && sda_in) current_state <= I2C_IDLE; // if(scl) // current_state <= I2C_RDATA; end I2C_RDATA: begin if(i2c_cnt==4'd15) current_state <= I2C_NACK; end I2C_NACK: begin if(i2c_cnt==4'd1) current_state <= I2C_STOP; end I2C_STOP: begin if(i2c_cnt==4'd1) current_state <= I2C_IDLE; end default:current_state <= I2C_IDLE; endcase always@(posedge i2c_clk or negedge rst_n) if(~rst_n) begin scl <= 1'b0; en <= 1'b0; sda_out <= 1'b0; databuf <= 8'd0; doutbuf <= 8'd0; end else case(current_state) I2C_IDLE: begin scl <= 1'b1; sda_out <= 1'b1; en <= 1'b1; end I2C_START: begin if(i2c_cnt==4'd0) begin scl <= 1'b1; sda_out <= 1'b0; end else scl <= 1'b0; databuf <= HARD_ADDR; end I2C_HADDR: begin scl <= ~scl; if(!scl) begin sda_out <= databuf[7]; databuf <= {databuf[6:0],1'b0}; end end I2C_HADDR_ACK: begin en <= 1'b0; scl <= ~scl; databuf <= {1'b1,AD_channel_buf,4'b0100}; end I2C_CMD: begin en <= 1'b1; scl <= ~scl; if(!scl) begin sda_out <= databuf[7]; databuf <= {databuf[6:0],1'b0}; end end I2C_CMD_ACK: begin en <= 1'b0; scl <= ~scl; databuf <= HARD_ADDR + 1'b1; end I2C_RESTART: begin en <= 1'b1; if(i2c_cnt==4'd0) begin scl <= 1'b1; sda_out <= 1'b1; end else if(i2c_cnt==4'd1) begin sda_out <= 1'b0; scl <= 1'b1; end else scl <= 1'b0; databuf <= HARD_ADDR + 1'b1; end I2C_WRADDR: begin scl <= ~scl; if(!scl) begin sda_out <= databuf[7]; databuf <= {databuf[6:0],1'b0}; end end I2C_WRADDR_ACK: begin en <= 1'b0; scl <= ~scl; end I2C_RDATA: begin en <= 1'b0; scl <= ~scl; if(!scl) doutbuf <= {doutbuf[6:0],sda_in}; end I2C_NACK: begin en <= 1'b0; scl <= ~scl; end I2C_STOP: begin en <= 1'b1; scl <= 1'b1; if(i2c_cnt==4'd0) sda_out <= 1'b0; else sda_out <= 1'b1; end default:; endcase
endmodule
转载于:https://www.cnblogs.com/wuqingjianke/p/3938467.html
ADS7830 FPGA实现相关推荐
- Intel发布FPGA
Intel发布FPGA FPGA概述 FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑).GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物. ...
- 芯片IP,SOC,FPGA智能卡
芯片IP,SOC,FPGA智能卡 华夏芯(北京)通用处理器技术有限公司(以下简称"华夏芯")是创新的异构处理器 IP 提供商和芯片解决方案提供商,集团总部在北京,并分别在上海.纽约 ...
- FPGA多功能应用处理器
FPGA多功能应用处理器 编解码加速卡 概述: 对于H.265/HEVC/VP9编解码处理,FPGA编解码加速卡方案有着完善的功能和preset配置,支持最多的有利于提高画质和降低bitrate的功能 ...
- Xilinx FPGA全局介绍
Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...
- 利用UltraScale和UltraScale+FPGA和MPSOC加速DSP设计生产力
利用UltraScale和UltraScale+FPGA和MPSOC加速DSP设计生产力 Accelerating DSP Design Productivity with UltraScale an ...
- 英特尔Intel® Arria® 10 FPGA加速器设计
英特尔Intel® Arria® 10 FPGA加速器设计 Introducing the Intel® Vision Accelerator Design with Intel® Arria® 10 ...
- 软件工具将GPU代码迁移到fpga以用于AI应用
软件工具将GPU代码迁移到fpga以用于AI应用 Software tools migrate GPU code to FPGAs for AI applications 人工智能软件初创公司Mips ...
- Xilinx Zynq FPGA Boards板
Xilinx Zynq FPGA Boards板 Xilinx Zynq FPGA Boards 介绍 Styx是一个易于使用的Zynq开发模块,具有Xilinx的Zynq ZC7020 SoC和FT ...
- 如何为应用选择最佳的FPGA(下)
如何为应用选择最佳的FPGA(下) How to select an FPGA board? FPGA板的选择在很大程度上受FPGA本身的影响,也受整个板的特性和性能的影响.们已经在上面的章节中讨论了 ...
最新文章
- ITOO4.1之缓存—分布式缓存Memcached学习(理论篇)
- 组信箱共享及挂载介绍
- 因子和(类素数筛选法)
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
- Android MediaPlayer 和 NativePlayer 播放格式控制
- Linux shell - 按时间和文件大小排序显示文件(ll)
- 常见List面试问题
- matlab 动画_MATLAB的动画制作和视频录制
- 优化SQL的执行速度
- Linux 下源代码阅读工具 —— vim + TagList + CTags
- 第二章 HTML5存储 Web存储
- KVM详解(三)——KVM创建虚拟机
- IDEA使用技巧--在文件导航栏中屏蔽指定后缀名的文件
- 浅析bin,lib,src的区别
- 七层网络协议模型(ISO模型)
- 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
- 有关AirtestiOS与iproxy报错“error connecting to device“
- Kettle之定时运行Job
- flutter 上滑悬浮吸顶
- gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file
热门文章
- 一年中的最后一天说说_2018最后一天感言说说 怎么发朋友圈告别2018年
- Linux之旅----硬件篇
- 从来不敷面膜的人_女人一旦过了40岁,敷面膜要记住“3不要”,否则还不如不敷!...
- Python爬虫——爬虫是什么都可以爬的吗?Robots协议!
- 《深入理解计算机系统》——低谷中的重新振作
- 电商基础知识:供应链产品介绍
- 失败魔咒下的企业海外并购(ZT)
- three.js判断两个向量(角度)夹角误差是否小于某个值
- stanza和DBPedia的安装与使用
- SPL工业智能:发现时序数据的异常