zoukankan      html  css  js  c++  java
  • verilog实验3:AD转换后串口输出到PC端

    一、实验任务

           通过tcl549AD转换芯片将模拟电压信号转换为数字信号,并通过串口显示到电脑上。此AD转换芯片为串行转换芯片,且转换速率要和串口选择的速率匹配。等待串口发送完后,再进行下一次AD转换。就实际应用而言,此转换速率有点低。

    二、代码开发

           根据AD芯片的芯片手册编写程序。以下为顶层程序。

           

    //将实时转换的数字结果通过串口传输到PC上
    module adc_top
        (
            clk,
            rst,
            ad_cs_out,//--TLC549片选信号
            ad_clk_out,//--TLC549时钟信号
            ad_data_in,//--TLC549数字的输入
            txd_out   //--串口输出
        );
    
    
        
    input clk,rst,ad_data_in;
    output ad_cs_out,ad_clk_out,txd_out;
    
    reg ad_cs_out,ad_clk_out;
    wire clk_100k,txd_out;
    reg [4:0] cnt;
    reg [7:0] addata;
    
    wire TxClk,TxFinish;
    reg XmitPlus;
    
    //416分频的,产生115200的时钟
    defparam Gen_RxClk.divdFACTOR=208,Gen_RxClk.divdWIDTH=7;//分频时钟
    gen_divd Gen_RxClk(.reset(rst),.clkin(clk),.clkout(TxClk));//端口名称关联
    
    
    //480分频的,产生100k的时钟
    defparam Gen_100k.divdFACTOR=240,Gen_100k.divdWIDTH=7;//分频时钟
    gen_divd Gen_100k(.reset(rst),.clkin(clk),.clkout(clk_100k));//端口名称关联
    
    //串口发送
    uart_t UartTx(.Bclk(TxClk),.Resett(rst),.Txd(txd_out),
                    .XmitCmdp(XmitPlus),.TxdBuf(addata),.TxDone(TxFinish));
    
    
    always @(posedge clk_100k or negedge rst)
    begin
        if(!rst)
            begin
                cnt<=5'd0;
                ad_cs_out<=1'b1;
                ad_clk_out<=1'b0;
                XmitPlus<=1'b0;
            end
        else
            begin
                cnt<=cnt+1'b1;
                case(cnt)
                    0:begin ad_cs_out<=1'b0;ad_clk_out<=1'b0;end
                    1:begin ad_clk_out<=1'b1;end
                    2:begin addata[7]<=ad_data_in;ad_clk_out<=1'b0;end
                    3:begin ad_clk_out<=1'b1;end
                    4:begin addata[6]<=ad_data_in;ad_clk_out<=1'b0;end
                    
                    5:begin ad_clk_out<=1'b1;end
                    6:begin addata[5]<=ad_data_in;ad_clk_out<=1'b0;end
                    7:begin ad_clk_out<=1'b1;end
                    8:begin addata[4]<=ad_data_in;ad_clk_out<=1'b0;end
                    
                    9:begin ad_clk_out<=1'b1;end
                    10:begin addata[3]<=ad_data_in;ad_clk_out<=1'b0;end
                    11:begin ad_clk_out<=1'b1;end
                    12:begin addata[2]<=ad_data_in;ad_clk_out<=1'b0;end
                    
                    13:begin ad_clk_out<=1'b1;end
                    14:begin addata[1]<=ad_data_in;ad_clk_out<=1'b0;end
                    15:begin ad_clk_out<=1'b1;end
                    16:begin addata[0]<=ad_data_in;ad_clk_out<=1'b0;end
    
    
                    17:begin ad_cs_out<=1'b1;end//--拉高CS,等待ADC内部转换,时间<=17us
                    //18:;
                    //19:;
                    //20:;
                    21:begin XmitPlus<=1'b1; end
                    //22:;
                    29:begin XmitPlus<=1'b0;end
                    30:
                        begin
                            if(TxFinish==1'b1)//等待发送完成
                                cnt<=5'd31;//发送完成,再按一次复位键,重新一次转换发送
                            else
                                cnt<=5'd30;
                        end
                
                    default:;
                endcase
            end
    end    
    endmodule

    三、感悟

           通过改变开发板上的可变电阻来改变串口调试助手的显示数字,其实速率真的是很低。毕竟串口就是一个很慢的转换,115200。而AD也只分频100k。楼主正在做一个40M的AD还是并行的,不知道能不能测试成功,希望能够赶紧把这个项目结束。

  • 相关阅读:
    mac与phy怎样实现网络自适应
    POJ 3304 Segments(计算几何:直线与线段相交)
    iOS类目
    MFC中改变控件的大小和位置(zz)
    Delphi中根据分类数据生成树形结构的最优方法
    Delphi下EasyGrid使用体会
    Delphi中Messagedlg用法
    Delphi获取其它进程窗口句柄的3种方法
    delphi获取一个窗口的所有子窗口(包括嵌套)
    关于获取其它程序窗口编辑框内容解决思路
  • 原文地址:https://www.cnblogs.com/amberwang2018/p/8443473.html
Copyright © 2011-2022 走看看