赞
踩
语言 :Verilg HDL 、VHDL
EDA工具:ISE、Vivado
在FPGA开发中,经常需要对整个系统进行健康信息监控以及版本信息管脚,这时,需要知道FPGA 当前程序的编译时间以及FPGA实时的温度电压信息,本文对这两个部分进行总结说明,方便诸君不时之需,直接调用便可,不需要多在这上面耗费时间和精力。
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
);
reg[15:0] vccint_dout
xadc_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的温度电压+使用源语 直接调用模块
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)
调用ip核与使用xadc源语本质是一样的,只是稍微有些繁琐。
IP核的主要设置如下:
(1)
(2)
(3)
(3)
IP的定层模块我也附上:
`timescale 1ns / 1ps
module 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 Read
assign di_in = 16'd0; //not used
assign dwe_in = 1'b0; //not used
assign den_in = eoc_out;
assign daddr_in = {2'd0,channel_out};
//-------------------------------------
//Read Temperature Data
reg temperature_dout_en ;
reg vccint_dout_en ;
reg vccaux_dout_en ;
reg vccbram__dout_en ;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
temperature_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;
end
else
begin
if((drdy_out) &&(channel_out == 5'd0)) // Latch ADCcode of On-chip-temperature
begin
temperature_dout <= (drdy_out==1'b1)?do_out:16'd0;
temperature_dout_en <= drdy_out;
end
else if((drdy_out) &&(channel_out == 5'd1)) // Latch ADCcode of VCCINT
begin
vccint_dout <= (drdy_out==1'b1)?do_out:16'd0;
vccint_dout_en <= drdy_out;
end
else if((drdy_out) &&(channel_out == 5'd2)) // Latch ADCcode of VCCAUX
begin
vccaux_dout <= (drdy_out==1'b1)?do_out:16'd0;
vccaux_dout_en <= drdy_out;
end
else if((drdy_out) &&(channel_out == 5'd6)) // Latch ADCcode of VCCBRAM
begin
vccbram_dout <= (drdy_out==1'b1)?do_out:16'd0;
vccbram__dout_en <= drdy_out;
end
else
begin
temperature_dout_en <= 1'b0;
vccint_dout_en <= 1'b0;
vccaux_dout_en <= 1'b0;
vccbram__dout_en <= 1'b0;
end
end
end
wire[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电压温度获取的方法,以及获取后将数据进行解析的公式,以上内容都是实际工程中验证过的,可放心使用,如有问题可私信博主,知无不言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。