欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > Vivado 比特流编译时间获取以及FPGA电压温度获取(实用)

Vivado 比特流编译时间获取以及FPGA电压温度获取(实用)

2025/5/2 15:42:15 来源:https://blog.csdn.net/qq_34895681/article/details/139331052  浏览:    关键词:Vivado 比特流编译时间获取以及FPGA电压温度获取(实用)

Vivado 比特流编译时间获取以及FPGA电压温度获取

语言 :Verilg HDL 、VHDL
EDA工具:ISE、Vivado

      • Vivado 比特流编译时间获取以及FPGA电压温度获取
        • 一、引言
        • 二、 获取FPGA 当前程序的编译时间
          • verilog中直接调用下面源语
          • 2. FPGA电压温度获取
          • (1)使用源语调用
          • (2)温度和电压解析
          • 温度解析公式
          • 电压解析公式
          • 测到的一组值:
          • (2)调用xadc ip核
        • 三、结尾

  • 关键词: 调用,Vivado,
一、引言

在FPGA开发中,经常需要对整个系统进行健康信息监控以及版本信息管脚,这时,需要知道FPGA 当前程序的编译时间以及FPGA实时的温度电压信息,本文对这两个部分进行总结说明,方便诸君不时之需,直接调用便可,不需要多在这上面耗费时间和精力。

二、 获取FPGA 当前程序的编译时间
verilog中直接调用下面源语
reg[31:0] DATA ;USR_ACCESSE2 USR_ACCESSE2_inst (.CFGCLK( ),       // 1-bit output: Configuration Clock output.DATA(DATA),           // 32-bit output: Configuration Data output.DATAVALID( )  // 1-bit output: Active high data valid output);

因为USR_ACCESSE2 为源语,所以直接在调用上面的模块,便可以得到32-bit 输出DATA,这便是当前bit(比特流)的详细编译时间,该数据的解析格式如下:

在这里插入图片描述
只需要把DATA中对应的位数取出来,即可解析出当前bit的编译时间年月日时分秒。

下面是 VHDL的调用。

inst_usr_access2: USR_ACCESSE2
port map (CFGCLK                  => open,DATA                    => bit_stream_info,DATAVALID               => open
);
2. FPGA电压温度获取
(1)使用源语调用
reg[15:0] vccint_doutxadc_test xadc_test_inst (.clk_100mhz(clk_50M), .rst_n(FPGA3_RST), .temperature_dout(temperature_dout), .vccint_dout(vccint_dout), .vccaux_dout(vccaux_dout), .vccbram_dout(vccbram_dout));

可以在下面链接中直接下载该模块,然后直接用上面的例化调用即可。
7系列以上xlinx FPGA +xadc模块+获取FPGA的温度电压+使用源语 直接调用模块

(2)温度和电压解析
温度解析公式
Temp()=(MEASURED_TEMP[15:4]* 503.975)/4096-273.15
电压解析公式
VCCINT=  (MEASURED_VCCINT[15:4]* 3)/4096
测到的一组值:

Tem: 16’hA534;

VCCINT: 16’h5478;
VCCAUX: 16’h988F;
VCCBRAM: 16’h535F;
([15:4]就是高12位,去掉低四位便是有效值。即:Tem有效值等于16’hA53)

(2)调用xadc ip核

调用ip核与使用xadc源语本质是一样的,只是稍微有些繁琐。

IP核的主要设置如下:
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)在这里插入图片描述
(3)
在这里插入图片描述

IP的定层模块我也附上:

`timescale 1ns / 1psmodule xadc_test(
input                 clk_100mhz,
input                 rst_n ,
output	reg[15:0]    temp_dout , //Data
output	reg	[15:0]    vccint_dout ,
output	reg	[15:0]    vccaux_dout ,
output	reg	[15:0]    vccbram_dout );wire    clk;reg[15:0]    temperature_dout;//-------------------------------------//---- XADC IP INST ------------- wire [15:0]	di_in;wire [6:0]	daddr_in;wire			den_in;wire			dwe_in;wire			drdy_out;wire [15:0]	do_out;wire [4:0]	channel_out;wire			eoc_out;wire			eos_out;wire			busy_out;assign clk = clk_100mhz;//XADC IP (Mode:Channel Sequencer)xadc_wiz_0 xadc_ip_inst (.di_in(di_in),                              // input wire [15 : 0] di_in.daddr_in(daddr_in),                        // input wire [6 : 0] daddr_in.den_in(den_in),                            // input wire den_in.dwe_in(dwe_in),                            // input wire dwe_in.drdy_out(drdy_out),                        // output wire drdy_out.do_out(do_out),                            // output wire [15 : 0] do_out.dclk_in(clk),                          // input wire dclk_in.reset_in(!rst_n),                        // input wire reset_in.vp_in(1'b0),                              // input wire vp_in.vn_in(1'b0),                              // input wire vn_in.user_temp_alarm_out(),  // output wire user_temp_alarm_out.vccint_alarm_out(),        // output wire vccint_alarm_out.vccaux_alarm_out(),        // output wire vccaux_alarm_out.ot_out(),                            // output wire ot_out.channel_out(channel_out),                  // output wire [4 : 0] channel_out.eoc_out(eoc_out),                          // output wire eoc_out.alarm_out(),                      // output wire alarm_out.eos_out(eos_out),                          // output wire eos_out.busy_out(busy_out)                        // output wire busy_out);//only Readassign di_in = 16'd0;   //not usedassign dwe_in = 1'b0;   //not usedassign den_in = eoc_out;assign daddr_in = {2'd0,channel_out};//-------------------------------------//Read Temperature Datareg    temperature_dout_en ;reg    vccint_dout_en ;reg    vccaux_dout_en ;reg    vccbram__dout_en ;always @(posedge clk or negedge rst_n)beginif(!rst_n) begintemperature_dout <= 16'd0;vccint_dout <= 16'd0;vccaux_dout <= 16'd0;vccbram_dout <= 16'd0;temperature_dout_en <= 1'b0;vccint_dout_en <= 1'b0;vccaux_dout_en <= 1'b0;vccbram__dout_en <= 1'b0;endelse beginif((drdy_out) &&(channel_out == 5'd0))     // Latch ADCcode of On-chip-temperaturebegintemperature_dout <= (drdy_out==1'b1)?do_out:16'd0;temperature_dout_en <= drdy_out;endelse if((drdy_out) &&(channel_out == 5'd1))     // Latch ADCcode of VCCINTbeginvccint_dout <= (drdy_out==1'b1)?do_out:16'd0;vccint_dout_en <= drdy_out;endelse if((drdy_out) &&(channel_out == 5'd2))     // Latch ADCcode of VCCAUXbeginvccaux_dout <= (drdy_out==1'b1)?do_out:16'd0;vccaux_dout_en <= drdy_out;endelse if((drdy_out) &&(channel_out == 5'd6))        // Latch ADCcode of VCCBRAMbeginvccbram_dout <= (drdy_out==1'b1)?do_out:16'd0;vccbram__dout_en <= drdy_out;endelsebegintemperature_dout_en <= 1'b0;vccint_dout_en <= 1'b0;vccaux_dout_en <= 1'b0;vccbram__dout_en <= 1'b0;endendendwire[20:0] p;mult_x504 m504 (.CLK(clk),  // input wire CLK.A(temperature_dout[15:4]),      // input wire [11 : 0] A.P(p)      // output wire [20 : 0] P
);  always@( posedge clk)  temp_dout = p[20:12] - 273 ; endmodule

其中mult_x504 是一个乘法器ip,输入值乘无符号数504,然后再减去273,就是结果temp_dout 就是真实的温度结果了。

三、结尾

本文总结了Vivado 比特流编译时间获取以及FPGA电压温度获取的方法,以及获取后将数据进行解析的公式,以上内容都是实际工程中验证过的,可放心使用,如有问题可私信博主,知无不言。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词