PMODAD1 实现模拟数据的采集 实现篇1

59 篇文章 4 订阅
54 篇文章 5 订阅
从硬件篇我们看到一个PMOD模块包含了两路ADC,他们公用SCLK和CSN,只是有两路各自的DATA输出,因此我们将采集模块简单修改一下,能同时采集两路,如下:
module ad7476_sample(
        input clk,rst,
        input  ADC_sdata0, ADC_sdata1,
        output reg ADC_sclk,ADC_csn,
        output reg [11:0]  adc_res0, adc_res1,
        output reg   adc_valid
    );

    reg [7:0] cntr ;
    always @ (posedge clk) //clk 35MHZ
        if (rst)cntr<=0;else if (cntr == 34) cntr<=0;else cntr<=cntr+1;


    always @ (posedge clk)
    case (cntr )
        0:  ADC_csn <= 0;
        33:  ADC_csn <= 1;
    endcase

    always @ (posedge clk)
    case (cntr)
        //0,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,34 :
        34,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,33 :ADC_sclk<=1;
        default ADC_sclk<=0;
    endcase

    always @ (posedge clk)
    case (cntr )
        8: adc_res0[11] <= ADC_sdata0 ;
        10:adc_res0[10] <= ADC_sdata0 ;
        12:adc_res0[9] <= ADC_sdata0 ;
        14:adc_res0[8] <= ADC_sdata0 ;
        16:adc_res0[7] <= ADC_sdata0 ;
        18:adc_res0[6] <= ADC_sdata0 ;
        20:adc_res0[5] <= ADC_sdata0 ;
        22:adc_res0[4] <= ADC_sdata0 ;
        24:adc_res0[3] <= ADC_sdata0 ;
        26:adc_res0[2] <= ADC_sdata0 ;
        28:adc_res0[1] <= ADC_sdata0 ;
        30:adc_res0[0] <= ADC_sdata0 ;
    endcase




    always @ (posedge clk)
    case (cntr )
        8: adc_res1[11] <= ADC_sdata1 ;
        10:adc_res1[10] <= ADC_sdata1 ;
        12:adc_res1[9] <= ADC_sdata1 ;
        14:adc_res1[8] <= ADC_sdata1 ;
        16:adc_res1[7] <= ADC_sdata1 ;
        18:adc_res1[6] <= ADC_sdata1 ;
        20:adc_res1[5] <= ADC_sdata1 ;
        22:adc_res1[4] <= ADC_sdata1 ;
        24:adc_res1[3] <= ADC_sdata1 ;
        26:adc_res1[2] <= ADC_sdata1 ;
        28:adc_res1[1] <= ADC_sdata1 ;
        30:adc_res1[0] <= ADC_sdata1 ;
    endcase


    always @ (posedge clk)adc_valid <= cntr == 32 ;


endmodule

我们将PMOD插入JA1,如下图:

直接从图上可以看出引脚对应

CSN->JA1

D0->JA2

D1->JA3

CLK->JA4 

之后我们再找找JA引脚对应关系,我在这里拷贝一下:

# PMOD JA

set_property  -dict {PACKAGE_PIN Y11   IOSTANDARD LVCMOS33} [get_ports pmod_ja1];
set_property  -dict {PACKAGE_PIN AA11  IOSTANDARD LVCMOS33} [get_ports pmod_ja2];
set_property  -dict {PACKAGE_PIN Y10   IOSTANDARD LVCMOS33  PULLUP true} [get_ports pmod_ja3];
set_property  -dict {PACKAGE_PIN AA9   IOSTANDARD LVCMOS33} [get_ports pmod_ja4];
set_property  -dict {PACKAGE_PIN AB11  IOSTANDARD LVCMOS33} [get_ports pmod_ja7];
set_property  -dict {PACKAGE_PIN AB10  IOSTANDARD LVCMOS33} [get_ports pmod_ja8];
set_property  -dict {PACKAGE_PIN AB9   IOSTANDARD LVCMOS33} [get_ports pmod_ja9];
set_property  -dict {PACKAGE_PIN AA8   IOSTANDARD LVCMOS33} [get_ports pmod_ja10];

# PMOD JB

set_property  -dict {PACKAGE_PIN W12   IOSTANDARD LVCMOS33} [get_ports pmod_jb1];
set_property  -dict {PACKAGE_PIN W11   IOSTANDARD LVCMOS33} [get_ports pmod_jb2];
set_property  -dict {PACKAGE_PIN V10   IOSTANDARD LVCMOS33  PULLUP true} [get_ports pmod_jb3];
set_property  -dict {PACKAGE_PIN W8    IOSTANDARD LVCMOS33} [get_ports pmod_jb4];
set_property  -dict {PACKAGE_PIN V12   IOSTANDARD LVCMOS33  PULLDOWN true} [get_ports pmod_jb7];
set_property  -dict {PACKAGE_PIN W10   IOSTANDARD LVCMOS33  PULLDOWN true} [get_ports pmod_jb8];
set_property  -dict {PACKAGE_PIN V9    IOSTANDARD LVCMOS33  PULLDOWN true} [get_ports pmod_jb9];
set_property  -dict {PACKAGE_PIN V8    IOSTANDARD LVCMOS33  PULLDOWN true} [get_ports pmod_jb10];

# PMOD JC

set_property  -dict {PACKAGE_PIN AB7   IOSTANDARD LVCMOS33} [get_ports pmod_jc1];
set_property  -dict {PACKAGE_PIN AB6   IOSTANDARD LVCMOS33} [get_ports pmod_jc2];
set_property  -dict {PACKAGE_PIN Y4    IOSTANDARD LVCMOS33  PULLUP true} [get_ports pmod_jc3];
set_property  -dict {PACKAGE_PIN AA4   IOSTANDARD LVCMOS33} [get_ports pmod_jc4];
set_property  -dict {PACKAGE_PIN R6    IOSTANDARD LVCMOS33} [get_ports pmod_jc7];
set_property  -dict {PACKAGE_PIN T6    IOSTANDARD LVCMOS33} [get_ports pmod_jc8];
set_property  -dict {PACKAGE_PIN T4    IOSTANDARD LVCMOS33} [get_ports pmod_jc9];
set_property  -dict {PACKAGE_PIN U4    IOSTANDARD LVCMOS33} [get_ports pmod_jc10];

# PMOD JD

set_property  -dict {PACKAGE_PIN V7    IOSTANDARD LVCMOS33} [get_ports pmod_jd1];
set_property  -dict {PACKAGE_PIN W7    IOSTANDARD LVCMOS33} [get_ports pmod_jd2];
set_property  -dict {PACKAGE_PIN V5    IOSTANDARD LVCMOS33  PULLUP true} [get_ports pmod_jd3];
set_property  -dict {PACKAGE_PIN V4    IOSTANDARD LVCMOS33} [get_ports pmod_jd4];
set_property  -dict {PACKAGE_PIN W6    IOSTANDARD LVCMOS33  PULLDOWN true} [get_ports pmod_jd7];
set_property  -dict {PACKAGE_PIN W5    IOSTANDARD LVCMOS33} [get_ports pmod_jd8];
set_property  -dict {PACKAGE_PIN U6    IOSTANDARD LVCMOS33} [get_ports pmod_jd9];
set_property  -dict {PACKAGE_PIN U5    IOSTANDARD LVCMOS33} [get_ports pmod_jd10];

因此我们对应完善一下PMODAD1引脚映射

CSN->JA1->Y11

D0->JA2->AA11

D1->JA3->Y10 

CLK->JA4 ->AA9


另外我们将采集到的数值用LED显示,由于只有8位LED,因此我们之考虑显示高8位。上层代码如下:

     
module PMODAD_LED(
        input clk,sw0,
        output  reg  [7:0] LED  ,
        input  ADC_sdata0, ADC_sdata1,
        output  ADC_sclk,ADC_csn
    );


    wire clk35M ;


    design_1_wrapper uu(
                         .clk_in1( clk ) ,
                         .clk_out1( clk35M )
                     );

    wire   [11:0]  adc_res0, adc_res1;
    wire     adc_valid;
    always @ (posedge clk35M)if (adc_valid) LED <= ( sw0 == 1 )  ?  adc_res0[11:4]   :  adc_res1[11:4]  ;

    ad7476_sample  u1(
                       .clk( clk35M )  ,
                       .rst( 1'b0 )  ,
                       .ADC_sdata0(ADC_sdata0  )  ,
                       .ADC_sdata1(ADC_sdata1  )  ,
                       .ADC_sclk(ADC_sclk  )  ,
                       .ADC_csn(ADC_csn  )  ,
                       .adc_res0(adc_res0  )  ,
                       .adc_res1(adc_res1  )  ,
                       .adc_valid(adc_valid  )
                   );

endmodule


 这里使用了一个sw0来切换两路显示。

引脚约束文件如下:

set_property PACKAGE_PIN Y9 [get_ports {clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]

set_property PACKAGE_PIN F22 [get_ports {sw0}]
set_property IOSTANDARD LVCMOS18 [get_ports {sw0}] 

set_property PACKAGE_PIN T22 [get_ports {LED[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]

set_property PACKAGE_PIN T21 [get_ports {LED[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]

set_property PACKAGE_PIN U22 [get_ports {LED[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]

set_property PACKAGE_PIN U21 [get_ports {LED[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]

set_property PACKAGE_PIN V22 [get_ports {LED[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}]

set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}]
set_property PACKAGE_PIN W22 [get_ports {LED[5]}]

set_property PACKAGE_PIN U19 [get_ports {LED[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}]

set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}]
set_property PACKAGE_PIN U14 [get_ports {LED[7]}]


set_property  -dict {PACKAGE_PIN Y11   IOSTANDARD LVCMOS33} [get_ports ADC_csn];
set_property  -dict {PACKAGE_PIN AA11  IOSTANDARD LVCMOS33} [get_ports ADC_sdata0];
set_property  -dict {PACKAGE_PIN Y10   IOSTANDARD LVCMOS33  } [get_ports ADC_sdata1];
set_property  -dict {PACKAGE_PIN AA9   IOSTANDARD LVCMOS33} [get_ports ADC_sclk];



下载到ZEBBOARD板子运行,一切正常,输入不同电压值,8个LED作为高8位会有数值的变化。

实验就成功了。另外如果有兴趣的话,可以考虑用ILA连续观测采集电压输入波形。



这两个Verilog代码可以放在一个.v文件中吗:1.`timescale 1ns / 1ps module Top(clk,sw,led,flag, ADC_sdata, ADC_sclk,ADC_csn,slec_wei,slec_duan); input clk; input [3:0]sw; output reg [7:0] led; input flag; input ADC_sdata; output ADC_sclk,ADC_csn; output [7:0] slec_wei; output [7:0] slec_duan; wire [11:0] adc_res; wire adc_valid; wire [19:0]cout; always@(posedge clk)if(adc_valid) led<=adc_res[11:4]; PmodAD1 U0( .clk(clk), .rst(1’b0), .ADC_sdata(ADC_sdata), .ADC_sclk(ADC_sclk), .ADC_csn(ADC_csn), .adc_res(adc_res), .adc_valid(adc_valid) ); data_ad_pro U1( .sys_clk(clk), .rst_n(1’b1), .pre_data(adc_res[11:4]), .cout(cout) ); display U2( .sys_clk(clk), .rst_n(1’b1), .cout(cout), .sw(sw), .flag(flag), .slec_wei(slec_wei), .slec_duan(slec_duan) ); endmodule ———————2.module PmodAD1( clk,rst, ADC_sdata,ADC_sclk,ADC_csn,adc_res,adc_valid); input clk,rst, ADC_sdata; output reg ADC_sclk,ADC_csn; output reg [11:0] adc_res; output reg adc_valid; reg [7:0] cntr; always@(posedge clk) if(rst)cntr<=0;else if(cntr==34)cntr<=0;else cntr<=cntr+1; always@(posedge clk) case (cntr) 0: ADC_csn<=0; 33: ADC_csn<=1; endcase always@(posedge clk) case(cntr) 34,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,33:ADC_sclk<=1; default ADC_sclk<=0; endcase always@(posedge clk) case(cntr) 8: adc_res[11]<= ADC_sdata; 10:adc_res[10]<= ADC_sdata; 12:adc_res[9]<= ADC_sdata; 14:adc_res[8]<= ADC_sdata; 16:adc_res[7]<= ADC_sdata; 18:adc_res[6]<= ADC_sdata; 20:adc_res[5]<= ADC_sdata; 22:adc_res[4]<= ADC_sdata; 24:adc_res[3]<= ADC_sdata; 26:adc_res[2]<= ADC_sdata; 28:adc_res[1]<= ADC_sdata; 30:adc_res[0]<= ADC_sdata; endcase always@(posedge clk)adc_valid<=cntr==32; endmodule
最新发布
06-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值