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

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

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

  • 关键词: 调用,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_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的温度电压+使用源语 直接调用模块

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

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要生成比文件,可以在Xilinx Vivado中按照以下步骤进行操作: 1. 首先,创建一个新的工程并添加所需的文件。这些文件可以是设计文件、约束文件、IP核等。 2. 在完成设计和约束后,进行综合和实现。综合将设计文件转换为门级网表,而实现则将门级网表映射到目标FPGA设备上。这些步骤可以确保设计在FPGA上正确实现。 3. 在实现完成后,需要进行管脚约束。通过约束文件,指定各个信号在FPGA芯片上的引脚位置,以确保设计的正常工作。 4. 接下来就是生成比文件。比文件是将设计编译FPGA所需的二进制文件,类似于编程中的可执行文件。你可以通过点击菜单中的"Program and Debug",然后选择"Generate Bitstream"来执行这个操作。 5. 生成比文件后,你可以将它下载到目标开发板上进行硬件验证。这一步通常需要使用烧写工具或者开发板自带的下载接口。 综上所述,vivado生成比文件的步骤包括创建工程、添加文件、综合、实现、管脚约束,然后通过"Program and Debug"菜单生成比文件,并将其下载到开发板上进行硬件验证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比文件、烧写程序...](https://blog.csdn.net/CLL_caicai/article/details/105276443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾引先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值