当前位置: 首页 > news >正文

【xilinx】不添加ZYNQ SOC SDK的情况下使用xilinx 的XADC

        可以使用ZYNQ SOC SDK驱动和使用XADC,但在一些场合不适合使用 PS 访问 XADC 的时候,可以通过原语调用 XADC,并且获取读取传感器和外置 ADC的参数。

纯 PL 接口访问 XADC 的方法,代码如下:

`timescale 1ns / 1ps
module ug480 (input DCLK, // Clock input for DRPinput RESET,input [3:0] VAUXP, VAUXN,  // Auxiliary analog channel inputsinput VP, VN,// Dedicated and Hardwired Analog Input Pairoutput reg [15:0] MEASURED_TEMP, MEASURED_VCCINT, output reg [15:0] MEASURED_VCCAUX, MEASURED_VCCBRAM,output reg [15:0] MEASURED_AUX0, MEASURED_AUX1, output reg [15:0] MEASURED_AUX2, MEASURED_AUX3,output wire [7:0] ALM,output wire [4:0]  CHANNEL,       output wire        OT,output wire        EOC,output wire        EOS);     wire busy;wire [5:0] channel;wire drdy;wire eoc;wire eos;wire i2c_sclk_in;wire i2c_sclk_ts;wire i2c_sda_in;wire i2c_sda_ts;reg [6:0] daddr;reg [15:0] di_drp;wire [15:0] do_drp;wire [15:0] vauxp_active;wire [15:0] vauxn_active;wire dclk_bufg;reg [1:0]  den_reg;reg [1:0]  dwe_reg;reg [7:0]   state = init_read;parameter       init_read       = 8'h00,read_waitdrdy   = 8'h01,write_waitdrdy  = 8'h03,read_reg00      = 8'h04,reg00_waitdrdy  = 8'h05,read_reg01      = 8'h06,reg01_waitdrdy  = 8'h07,read_reg02      = 8'h08,reg02_waitdrdy  = 8'h09,read_reg06      = 8'h0a,reg06_waitdrdy  = 8'h0b,read_reg10      = 8'h0c,reg10_waitdrdy  = 8'h0d,read_reg11      = 8'h0e,reg11_waitdrdy  = 8'h0f,read_reg12      = 8'h10,reg12_waitdrdy  = 8'h11,read_reg13      = 8'h12,reg13_waitdrdy  = 8'h13;BUFG i_bufg (.I(DCLK), .O(dclk_bufg));always @(posedge dclk_bufg)if (RESET) beginstate   <= init_read;den_reg <= 2'h0;dwe_reg <= 2'h0;di_drp  <= 16'h0000;endelsecase (state)init_read : begindaddr <= 7'h40;den_reg <= 2'h2; // performing readif (busy == 0 ) state <= read_waitdrdy;endread_waitdrdy : if (eos ==1)  	begindi_drp <= do_drp  & 16'h03_FF; //Clearing AVG bits for Configreg0daddr <= 7'h40;den_reg <= 2'h2;dwe_reg <= 2'h2; // performing writestate <= write_waitdrdy;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;state <= state;                endwrite_waitdrdy : if (drdy ==1) beginstate <= read_reg00;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg00 : begindaddr   <= 7'h00;den_reg <= 2'h2; // performing readif (eos == 1) state   <=reg00_waitdrdy;endreg00_waitdrdy : if (drdy ==1)  	beginMEASURED_TEMP <= do_drp; state <=read_reg01;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg01 : begindaddr   <= 7'h01;den_reg <= 2'h2; // performing readstate   <=reg01_waitdrdy;endreg01_waitdrdy : if (drdy ==1)  	beginMEASURED_VCCINT = do_drp; state <=read_reg02;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg02 : begindaddr   <= 7'h02;den_reg <= 2'h2; // performing readstate   <=reg02_waitdrdy;endreg02_waitdrdy : if (drdy ==1)  	beginMEASURED_VCCAUX <= do_drp; state <=read_reg06;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg06 : begindaddr   <= 7'h06;den_reg <= 2'h2; // performing readstate   <=reg06_waitdrdy;endreg06_waitdrdy : if (drdy ==1)  	beginMEASURED_VCCBRAM <= do_drp; state <= read_reg10;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg10 : begindaddr   <= 7'h10;den_reg <= 2'h2; // performing readstate   <= reg10_waitdrdy;endreg10_waitdrdy : if (drdy ==1)  	beginMEASURED_AUX0 <= do_drp; state <= read_reg11;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg11 : begindaddr   <= 7'h11;den_reg <= 2'h2; // performing readstate   <= reg11_waitdrdy;endreg11_waitdrdy : if (drdy ==1)  	beginMEASURED_AUX1 <= do_drp; state <= read_reg12;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg12 : begindaddr   <= 7'h12;den_reg <= 2'h2; // performing readstate   <= reg12_waitdrdy;endreg12_waitdrdy : if (drdy ==1)  	beginMEASURED_AUX2 <= do_drp; state <= read_reg13;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          endread_reg13 : begindaddr   <= 7'h13;den_reg <= 2'h2; // performing readstate   <= reg13_waitdrdy;endreg13_waitdrdy :if (drdy ==1)  	beginMEASURED_AUX3 <= do_drp; state <=read_reg00;daddr   <= 7'h00;endelse beginden_reg <= { 1'b0, den_reg[1] } ;dwe_reg <= { 1'b0, dwe_reg[1] } ;      state <= state;          enddefault : begindaddr <= 7'h40;den_reg <= 2'h2; // performing readstate <= init_read;endendcaseXADC #(// Initializing the XADC Control Registers.INIT_40(16'h9000),// averaging of 16 selected for external channels.INIT_41(16'h2ef0),// Continuous Seq Mode, Disable unused ALMs, Enable calibration.INIT_42(16'h0400),// Set DCLK divides.INIT_48(16'h4701),// CHSEL1 - enable Temp VCCINT, VCCAUX, VCCBRAM, and calibration.INIT_49(16'h000f),// CHSEL2 - enable aux analog channels 0 - 3.INIT_4A(16'h0000),// SEQAVG1 disabled.INIT_4B(16'h0000),// SEQAVG2 disabled.INIT_4C(16'h0000),// SEQINMODE0 .INIT_4D(16'h0000),// SEQINMODE1.INIT_4E(16'h0000),// SEQACQ0.INIT_4F(16'h0000),// SEQACQ1.INIT_50(16'hb5ed),// Temp upper alarm trigger 85�C.INIT_51(16'h5999),// Vccint upper alarm limit 1.05V.INIT_52(16'hA147),// Vccaux upper alarm limit 1.89V.INIT_53(16'hdddd),// OT upper alarm limit 125�C - see Thermal Management.INIT_54(16'ha93a),// Temp lower alarm reset 60�C.INIT_55(16'h5111),// Vccint lower alarm limit 0.95V.INIT_56(16'h91Eb),// Vccaux lower alarm limit 1.71V.INIT_57(16'hae4e),// OT lower alarm reset 70�C - see Thermal Management.INIT_58(16'h5999),// VCCBRAM upper alarm limit 1.05V.SIM_MONITOR_FILE("design.txt")// Analog Stimulus file for simulation
)
XADC_INST (// Connect up instance IO. See UG480 for port descriptions.CONVST (1'b0),// not used.CONVSTCLK  (1'b0), // not used.DADDR  (daddr),.DCLK   (dclk_bufg),.DEN    (den_reg[0]),.DI     (di_drp),.DWE    (dwe_reg[0]),.RESET  (RESET),.VAUXN  (vauxn_active ),.VAUXP  (vauxp_active ),.ALM    (ALM),.BUSY   (busy),.CHANNEL(CHANNEL),.DO     (do_drp),.DRDY   (drdy),.EOC    (eoc),.EOS    (eos),.JTAGBUSY   (),// not used.JTAGLOCKED (),// not used.JTAGMODIFIED   (),// not used.OT     (OT),.MUXADDR    (),// not used.VP     (VP),.VN     (VN)
);assign vauxp_active = {12'h000, VAUXP[3:0]};assign vauxn_active = {12'h000, VAUXN[3:0]};assign EOC = eoc;assign EOS = eos;endmodule

仿真参数文件 design.txt
 

 

TIME VAUXP[0] VAUXN[0] VAUXP[1] VAUXN[1] VAUXP[2] VAUXN[2] VAUXP[3] VAUXN[3] TEMP VCCINT VCCAUX VCCBRAM
00000 0.005 0.0 0.2 0.0 0.5 0.0 0.1 0.0 25 1.0 1.8 1.0
67000 0.020 0.0 0.400 0.0 0.49 0.0 0.2 0.0 85 1.05 1.9 1.05
100000 0.049 0.0 0.600 0.0 0.51 0.0 0.5 0.0 105 0.95 1.71 0.95
134000 0.034 0.0 0.900 0.0 0.53 0.0 0.0 0.0 0 1.00 1.8 1.0

 仿真 tb 文件

`timescale 1ns / 1ps
module ug480_tb;reg [3:0]      VAUXP, VAUXN;reg             RESET;reg             DCLK;wire [15:0]     MEASURED_TEMP, MEASURED_VCCINT, MEASURED_VCCAUX; wire [15:0]     MEASURED_VCCBRAM, MEASURED_AUX0, MEASURED_AUX1; wire [15:0]     MEASURED_AUX2, MEASURED_AUX3;wire [15:0]     ALM;initial begin DCLK = 0;RESET = 0;endalways #(10) DCLK= ~DCLK;// Instantiate the Unit Under Test (UUT)
ug480 uut (.VAUXP  (VAUXP),.VAUXN  (VAUXN),.RESET  (RESET),.ALM  (ALM),.DCLK   (DCLK),.MEASURED_TEMP    (MEASURED_TEMP), .MEASURED_VCCINT  (MEASURED_VCCINT), .MEASURED_VCCAUX  (MEASURED_VCCAUX),.MEASURED_VCCBRAM (MEASURED_VCCBRAM),.MEASURED_AUX0    (MEASURED_AUX0),.MEASURED_AUX1    (MEASURED_AUX1),.MEASURED_AUX2    (MEASURED_AUX2),.MEASURED_AUX3    (MEASURED_AUX3)
);endmodule

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UEFI开发——编写一个简单的PPI
  • 解决世界500强跨域跨境数据文件传输丢包严重、高延迟等问题
  • geojson数据与graphic数据层级zIndex叠加控制说明详解
  • 黑神话悟空无法登录服务器怎么办
  • Express路由基础与高级功能深入解析
  • TCP/IP 协议:互联网的基石
  • 【Leetcode 2154 】 将找到的值乘以 2 —— 哈希表
  • 【Rust光年纪】提升Rust文件操作效率:探秘6大利器
  • AUTOSAR OS详细介绍及配置说明(更新版20240829)
  • 逻辑长路短路“且“运算
  • 【附解决方法】由于找不到vcruntime140_1.dll 无法继续执行代码如何处理
  • Memory-based Controller Shutdown (PCIe)
  • 精通Redis-CLI:命令行玩转高效缓存
  • Ascend C算子开发(入门)—— 算子开发环境搭建
  • MyPrint打印设计器(四)vue3 函数式调用组件
  • ES6指北【2】—— 箭头函数
  • android 一些 utils
  • CentOS 7 防火墙操作
  • Docker容器管理
  • Golang-长连接-状态推送
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java中的hashCode
  • linux安装openssl、swoole等扩展的具体步骤
  • log4j2输出到kafka
  • overflow: hidden IE7无效
  • PHP 的 SAPI 是个什么东西
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SSH 免密登录
  • 阿里云前端周刊 - 第 26 期
  • 漂亮刷新控件-iOS
  • 三分钟教你同步 Visual Studio Code 设置
  • UI设计初学者应该如何入门?
  • 阿里云服务器如何修改远程端口?
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 职场生活之道:善于团结
  • #etcd#安装时出错
  • #VERDI# 关于如何查看FSM状态机的方法
  • $.ajax,axios,fetch三种ajax请求的区别
  • $.proxy和$.extend
  • (2)Java 简介
  • (Java入门)学生管理系统
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (剑指Offer)面试题34:丑数
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (三十五)大数据实战——Superset可视化平台搭建
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (学习日记)2024.01.09
  • (一一四)第九章编程练习
  • (转)3D模板阴影原理
  • (转)http-server应用
  • .NET Compact Framework 多线程环境下的UI异步刷新