当前位置:   article > 正文

XADC数据采集放入双端口RAM 以及读取RAM数据

XADC数据采集放入双端口RAM 以及读取RAM数据

XADC数据采集放入双端口RAM 以及读取RAM数据

XADC读取之前已经发过了

XADC

接着是将数据存储到双端口RAM

双端口RAM:类似两片RAM单独用clk、ena、wea、addr、douta、dina控制,所以有两套这样的参数
伪双端口RAM:两组时钟、两个地址、一个输入dina、一个douta 可以进行读和写(FIFO中比较常用)
单端口RAM:一个时钟、一个地址、一个douta、一个dina
控制逻辑上有些区别
其中相同的有

ena = 1 :使能信号
wea = 1 :写
wea = 0 :读

以下是demo
顶层文件:

module XADC_top(
input clk_in,
input vp_in,
input vn_in,   
input vauxp7,  
input vauxn7,  
input vauxp15, 
input vauxn15
);

wire [4:0] channel_out;
wire eoc_out;
wire drdy_out;
wire [15:0] do_out;
wire [11:0] do_out_real;

assign do_out_real = do_out>>4;

xadc_wiz_0 xadc (
  .di_in(16'b0),              // input wire [15 : 0] di_in
  .daddr_in({2'b0,channel_out}),        // input wire [6 : 0] daddr_in
  .den_in(eoc_out),            // input wire den_in
  .dwe_in(1'b0),            // 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_in),          // input wire dclk_in
  .reset_in(),        // input wire reset_in
  .vp_in  (vp_in),              // input wire vp_in
  .vn_in  (vn_in),              // input wire vn_in
  .vauxp7 (vauxp7),            // input wire vauxp7
  .vauxn7 (vauxn7),            // input wire vauxn7
  .vauxp15(vauxp15),          // input wire vauxp15
  .vauxn15(vauxn15),          // input wire vauxn15
  .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(),          // output wire eos_out
  .busy_out()        // output wire busy_out
);

data_cap data_cap(             
  .clk_in       (clk_in),             
  .drdy_out     (drdy_out),            
  .channel_out  (channel_out),   
  .do_out       (do_out)
);   
ila_0 your_instance_name (
	.clk(clk_in), // input wire clk
	
	.probe0(channel_out), // input wire [4:0]  probe0  
	.probe1(data_cap.addr), // input wire [9:0]  probe1 
	.probe2(data_cap.data_in), // input wire [15:0]  probe2 
	.probe3(data_cap.addr_reg), // input wire [9:0]  probe3 
	.probe4(data_cap.data_out), // input wire [15:0]  probe4 
	.probe5(do_out) // input wire [15:0]  probe5
);


endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

数据控制模块文件


module data_cap(
input    clk_in,
input   drdy_out,
input   [4:0] channel_out,
input   [15:0] do_out
    );
    
reg [11:0] Temperature;
reg [11:0] Vcc_int;
reg [11:0] v_in;
reg [11:0] v_in7;
reg [11:0] v_in15;
reg ena;
reg enb;
reg wea;
reg web;
reg [9:0] addr;
reg [9:0] addr_reg;
wire [9:0] addrb;
reg [15:0] data_in;
wire [15:0] data_out;

always@(posedge clk_in)
begin
    addr_reg <= addr;
end

assign addrb = addr_reg;


always@(posedge clk_in)
begin
if(drdy_out == 1'b1 && channel_out ==5'd0) 
    begin
        data_in <= {4'b0,Temperature};
        if(addr < 10'd1023)
             addr <= addr + 1'b1;
        else
            addr <= 10'd0;
    end
else
    begin
      addr <= addr;
    end
end
    
    
always@(posedge clk_in)
begin
if(drdy_out == 1'b1 && channel_out ==5'd0)begin    
    Temperature <= do_out[15:4];   
    end 
else if ( drdy_out == 1'b1 && channel_out ==5'd1) begin
    Vcc_int <= do_out[15:4] ;
    end 
else if ( drdy_out == 1'b1 && channel_out ==5'h10) begin
    v_in <= do_out[15:4];
    end 
else if ( drdy_out == 1'b1 && channel_out ==5'h17) begin
    v_in7 <= do_out[15:4];
    end
else if ( drdy_out == 1'b1 && channel_out ==5'h1F) begin
    v_in15 <= do_out[15:4] ;
end 
else begin
    Vcc_int <= Vcc_int ;
    Temperature <=  Temperature ;       
end  
end 

blk_mem_gen_0 ADC_T (
  .clka(clk_in),    // input wire clka
  .ena(1'b1),      // input wire ena
  .wea(1'b1),      // input wire [0 : 0] wea
  .addra(addr),  // input wire [9 : 0] addra
  .dina(data_in),    // input wire [15 : 0] dina
  .douta(),  // output wire [15 : 0] douta
  .clkb(clk_in),    // input wire clkb
  .enb(1'b1),      // input wire enb
  .web(1'b0),      // input wire [0 : 0] web
  .addrb(addrb),  // input wire [9 : 0] addrb
  .dinb(),    // input wire [15 : 0] dinb
  .doutb(data_out)  // output wire [15 : 0] doutb
);

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

以下是结果(存储了温度数据):

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
自带ADC图像:
在这里插入图片描述
data -->tempreal:公式:
tempreal = data*503.975/4096 – 273.15
tempreal = 2580(a14)*503.975/4096 – 273.15 = 44.2951904296875
一致。

接下来想做 XADC采集信号 进行傅里叶变换

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/509837
推荐阅读
相关标签
  

闽ICP备14008679号