赞
踩
双端口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采集信号 进行傅里叶变换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。