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电压温度获取的方法,以及获取后将数据进行解析的公式,以上内容都是实际工程中验证过的,可放心使用,如有问题可私信博主,知无不言。