PCB设计的一般原则
Xilinx学习心得1-管脚约束

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实现相关推荐

  1. Intel发布FPGA

    Intel发布FPGA FPGA概述 FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑).GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物. ...

  2. 芯片IP,SOC,FPGA智能卡

    芯片IP,SOC,FPGA智能卡 华夏芯(北京)通用处理器技术有限公司(以下简称"华夏芯")是创新的异构处理器 IP 提供商和芯片解决方案提供商,集团总部在北京,并分别在上海.纽约 ...

  3. FPGA多功能应用处理器

    FPGA多功能应用处理器 编解码加速卡 概述: 对于H.265/HEVC/VP9编解码处理,FPGA编解码加速卡方案有着完善的功能和preset配置,支持最多的有利于提高画质和降低bitrate的功能 ...

  4. Xilinx FPGA全局介绍

    Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...

  5. 利用UltraScale和UltraScale+FPGA和MPSOC加速DSP设计生产力

    利用UltraScale和UltraScale+FPGA和MPSOC加速DSP设计生产力 Accelerating DSP Design Productivity with UltraScale an ...

  6. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel® Arria® 10 FPGA加速器设计 Introducing the Intel® Vision Accelerator Design with Intel® Arria® 10 ...

  7. 软件工具将GPU代码迁移到fpga以用于AI应用

    软件工具将GPU代码迁移到fpga以用于AI应用 Software tools migrate GPU code to FPGAs for AI applications 人工智能软件初创公司Mips ...

  8. Xilinx Zynq FPGA Boards板

    Xilinx Zynq FPGA Boards板 Xilinx Zynq FPGA Boards 介绍 Styx是一个易于使用的Zynq开发模块,具有Xilinx的Zynq ZC7020 SoC和FT ...

  9. 如何为应用选择最佳的FPGA(下)

    如何为应用选择最佳的FPGA(下) How to select an FPGA board? FPGA板的选择在很大程度上受FPGA本身的影响,也受整个板的特性和性能的影响.们已经在上面的章节中讨论了 ...

最新文章

  1. ITOO4.1之缓存—分布式缓存Memcached学习(理论篇)
  2. 组信箱共享及挂载介绍
  3. 因子和(类素数筛选法)
  4. [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
  5. Android MediaPlayer 和 NativePlayer 播放格式控制
  6. Linux shell - 按时间和文件大小排序显示文件(ll)
  7. 常见List面试问题
  8. matlab 动画_MATLAB的动画制作和视频录制
  9. 优化SQL的执行速度
  10. Linux 下源代码阅读工具 —— vim + TagList + CTags
  11. 第二章 HTML5存储 Web存储
  12. KVM详解(三)——KVM创建虚拟机
  13. IDEA使用技巧--在文件导航栏中屏蔽指定后缀名的文件
  14. 浅析bin,lib,src的区别
  15. 七层网络协议模型(ISO模型)
  16. 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
  17. 有关AirtestiOS与iproxy报错“error connecting to device“
  18. Kettle之定时运行Job
  19. flutter 上滑悬浮吸顶
  20. gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file

热门文章

  1. 一年中的最后一天说说_2018最后一天感言说说 怎么发朋友圈告别2018年
  2. Linux之旅----硬件篇
  3. 从来不敷面膜的人_女人一旦过了40岁,敷面膜要记住“3不要”,否则还不如不敷!...
  4. Python爬虫——爬虫是什么都可以爬的吗?Robots协议!
  5. 《深入理解计算机系统》——低谷中的重新振作
  6. 电商基础知识:供应链产品介绍
  7. 失败魔咒下的企业海外并购(ZT)
  8. three.js判断两个向量(角度)夹角误差是否小于某个值
  9. stanza和DBPedia的安装与使用
  10. SPL工业智能:发现时序数据的异常