您当前的位置:五五电子网电子知识单片机-工控设备单片机通信PC与外部硬件电路的通信接口设计 正文
PC与外部硬件电路的通信接口设计

PC与外部硬件电路的通信接口设计

点击数:7275 次   录入时间:03-04 11:57:07   整理:http://www.55dianzi.com   单片机通信


www.55dianzi.com

    //clk_bps sync bps generater

    reg clk_bps_r0,clk_bps_r1,clk_bps_r2;

    always@(posedge clk or negedge rst_n)

    begin

    if(!rst_n)

    begin

    clk_bps_r0 <= 0;

    clk_bps_r1 <= 0;

    clk_bps_r2 <= 0;

    end

    else

    begin

    if(bps_cnt1 < 32'h7FFF_FFFF)

    clk_bps_r0 <= 0;

    else

    clk_bps_r0 <= 1;

    clk_bps_r1 <= clk_bps_r0;

    clk_bps_r2 <= clk_bps_r1;

    end

    end

    assign clk_bps = ~clk_bps_r2 & clk_bps_r1;

    //------------------------------------------

    //clk_smp sync receive bps generator

    reg clk_smp_r0,clk_smp_r1,clk_smp_r2;

    always@(posedge clk or negedge rst_n)

    begin

    if(!rst_n)

    begin

    clk_smp_r0 <= 0;

    clk_smp_r1 <= 0;

    clk_smp_r2 <= 0;

    end

    else

    begin

    if(bps_cnt2 < 32'h7FFF_FFFF)

    clk_smp_r0 <= 0;

    else

    clk_smp_r0 <= 1;

    clk_smp_r1 <= clk_smp_r0;

    clk_smp_r2 <= clk_smp_r1;

    end

    end

    assign clk_smp = ~clk_smp_r2 & clk_smp_r1;

    endmodule



www.55dianzi.com

    代码中Bingo设置了多个选项的bps,根据您的需要,可以直接修改代码,来达到自己的要求。本模块的功能主要功能是生成两个时钟:

    a) clk_bps : UART TXD信号线数据发送的波特率

    b) clk_smp: UART RXD信号线数据接受的采样速率,以对已波特率的16倍速度采样,捕获数据的中点,在数据最稳态读取数据,达到最大限制的稳定。

    (2)TXD发送模块

    这部分代码比较简单,因为FPGA是主控,只要根据固定的时序给数据即可。Bingo设计了一个状态机来完成时序,状态机代码如下:

    always@(posedge clk or negedge rst_n)

    begin

    if(!rst_n)

    begin

    txd_state <= T_IDLE;

    txd_flag_r <= 0;

    txd <= 1'b1;

    end

    else

    begin

    case(txd_state)

    T_IDLE:

    begin

    txd <= 1;

    txd_flag_r <= 0;

    if(txd_en == 1)

    txd_state <= T_SEND;

    else

    txd_state <= T_IDLE;

    end

    T_SEND:

    begin

    if(clk_bps == 1)

    begin

    if(txd_cnt < 4'd9)

    txd_cnt <= txd_cnt + 1'b1;

    else

    begin

    txd_cnt <= 0;

    txd_state <= T_IDLE;

    txd_flag_r <= 1;

    end

    case(txd_cnt)

    4'd0: txd <= 0;

    4'd1: txd <= txd_data[0];

    4'd2: txd <= txd_data[1];

    4'd3: txd <= txd_data[2];

    4'd4: txd <= txd_data[3];

    4'd5: txd <= txd_data[4];

    4'd6: txd <= txd_data[5];

    4'd7: txd <= txd_data[6];

    4'd8: txd <= txd_data[7];

    4'd9: txd <= 1;

    endcase

    end

    end

    endcase

    end

    End

    数据发送的状态机设计如下:

 12.jpg

同时,为了软件调试,数据识别等的方便,Bingo在此模块设置了数据发送标志位。此部分主要参考了Bingo“第七章 你想干嘛——边沿检测技术”的方法,此处不再做累赘阐述,若有不懂请看上文。此部分代码如下:



www.55dianzi.com

    //-------------------------------------

    //Capture the falling of data transfer over

    reg txd_flag_r0,txd_flag_r1;

    always@(posedge clk or negedge rst_n)

    begin

    if(!rst_n)

    begin

    txd_flag_r0 <= 0;

    txd_flag_r1 <= 0;

    end

    else

    begin

    txd_flag_r0 <= txd_flag_r;

    txd_flag_r1 <= txd_flag_r0;

    end

    end

    assign txd_flag = txd_flag_r1 & ~txd_flag_r0;

    (3)RXD发送模块

    由于接收数据的时候,主控是PC,从机是FPGA,因此FPGA需要采样数据。以上波特率发生器中讲到过,采样时钟clk_bps = 16*clk_bps。FPGA硬件描述,通过计数,当采样到RXD数据起始位信号有效时,0-7-15开始计数,,其中7为数据的中点,最稳定的时刻。因此在此时采样数据,能够达到最稳定的效果。Bingo设计代码如下:

    always@(posedge clk or negedge rst_n)

    begin

    if(!rst_n)

    begin

    smp_cnt <= 0;

    rxd_cnt <= 0;

    rxd_data <= 0;

    rxd_state <= R_IDLE;

    end

    else if(clk_smp == 1)

    begin

    case(rxd_state)

    R_IDLE:

    begin

    rxd_cnt <= 0;

    if(rxd_sync == 1'b0)

    begin

    smp_cnt <= smp_cnt + 1'b1;

    if(smp_cnt == 4'd7) //8 clk_smp enable

    rxd_state <= R_SAMPLE;

    end

    else

    smp_cnt <= 0;

    end

    R_SAMPLE:

    begin

    smp_cnt <= smp_cnt +1'b1;

    if(smp_cnt == 4'd7)

    begin

    rxd_cnt <= rxd_cnt +1'b1;

    if(rxd_cnt == 4'd7)

    rxd_state <= R_IDLE;

    case(rxd_cnt)

    3'd0: rxd_data[0] <= rxd_sync;

    3'd1: rxd_data[1] <= rxd_sync;

    3'd2: rxd_data[2] <= rxd_sync;

    3'd3: rxd_data[3] <= rxd_sync;

    3'd4: rxd_data[4] <= rxd_sync;

    3'd5: rxd_data[5] <= rxd_sync;

    3'd6: rxd_data[6] <= rxd_sync;

    3'd7: rxd_data[7] <= rxd_sync;

    endcase

    end

    end

    endcase

    end

    end



www.55dianzi.com

    同样,发送部分状态机如下如下所示:

    4、USB代码测试图:

13.jpg

    三、USB通信接口设计

    1、USB通信协议

    USB : Universal Serial BUS(通用串行总线)的缩写,而其中文简称为“通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、MICroSOFt等多家公司联合提出的。

上一页  [1] [2] [3]  下一页


本文关键字:硬件  通信  接口  单片机通信单片机-工控设备 - 单片机通信

《PC与外部硬件电路的通信接口设计》相关文章>>>