XADC数据采集放入双端口RAM 以及读取RAM数据
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
数据控制模块文件
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
以下是结果(存储了温度数据):
自带ADC图像:
data -->tempreal:公式:
tempreal = data*503.975/4096 – 273.15
tempreal = 2580(a14)*503.975/4096 – 273.15 = 44.2951904296875
一致。
接下来想做 XADC采集信号 进行傅里叶变换