在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 手機(jī)與無線通信 > 牛人業(yè)話 > 小梅哥和你一起深入學(xué)習(xí)FPGA之串口調(diào)試(一)(上)

            小梅哥和你一起深入學(xué)習(xí)FPGA之串口調(diào)試(一)(上)

            作者: 時間:2015-11-19 來源:網(wǎng)絡(luò) 收藏

              以上為波特率發(fā)生器的代碼及分析,波特率發(fā)生模塊在例化時被分別例化為串口發(fā)送波特率發(fā)生器和串口接收波特率發(fā)生器。接下來我們再來分析串口接收模塊的代碼。

            本文引用地址:http://www.biyoush.com/article/283059.htm

              1 module my_uart_rx (

              2 clk, rst_n ,

              3 rs232_rx , rx_data , rx_int ,

              4 clk_bps , bps_start

              5 );

              6

              7 input clk; // 50MHz

              8 input rst_n ; //

              9 input rs232_rx ; // RS232

              10 input clk_bps ; // clk_bps

              11 output bps_start ; //

              12 output [ 7: 0] rx_data ; //

              13 output rx_int ; // ,

              14

              15 //---------------------------------------------------------

              16 reg rs232_rx0 , rs232_rx1 , rs232_rx2 , rs232_rx3 ; //

              17 wire neg_rs232_rx ; //

              18

              19 always @ ( posedge clk or negedge rst_n ) begin

              20 if(! rst_n ) begin

              21 rs232_rx0 <= 1'b0 ;

              22 rs232_rx1 <= 1'b0 ;

              23 rs232_rx2 <= 1'b0 ;

              24 rs232_rx3 <= 1'b0 ;

              25 end

              26 else begin

              27 rs232_rx0 <= rs232_rx ;

              28 rs232_rx1 <= rs232_rx0 ;

              29 rs232_rx2 <= rs232_rx1 ;

              30 rs232_rx3 <= rs232_rx2 ;

              31 end

              32 end

              33 // <20ns-40ns ( )

              34 //

              35 // 40ns

              36 assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0; // neg_rs232_rx

              37

              38 //---------------------------------------------------------

              39 reg bps_start_r ;

              40 reg[ 3: 0] num; //

              41 reg rx_int ; // ,

              42

              43 always @ ( posedge clk or negedge rst_n )

              44 if(! rst_n ) begin

              45 bps_start_r <= 1'bz ;

              46 rx_int <= 1'b0 ;

              47 end

              48 else if( neg_rs232_rx ) begin

              // rs232_rx

              49 bps_start_r <= 1'b1 ; //

              50 rx_int <= 1'b1 ; //

              51 end

              52 else if( num==4'd12 ) begin //

              53 bps_start_r <= 1'b0 ; //

              54 rx_int <= 1'b0 ; //

              55 end

              56

              57 assign bps_start = bps_start_r ;

              58

              59 //---------------------------------------------------------

              60 reg[ 7 : 0] rx_data_r ; //

              61 //---------------------------------------------------------

              62

              63 reg[ 7 : 0] rx_temp_data ; //

              64

              65 always @ ( posedge clk or negedge rst_n )

              66 if(! rst_n ) begin

              67 rx_temp_data <= 8'd0 ;

              68 num <= 4'd0 ;

              69 rx_data_r <= 8'd0 ;

              70 end

              71 else if( rx_int ) begin //

              72 if( clk_bps ) begin

              // , 8bit 1 2

              73 num <= num+1'b1 ;

              74 case ( num)

              75 4'd1:rx_temp_data[0] <= rs232_rx; // 0bit

              76 4'd2:rx_temp_data [1] <= rs232_rx; // 1bit

              77 4'd3:rx_temp_data [2] <= rs232_rx; // 2bit

              78 4'd4:rx_temp_data [3] <= rs232_rx; // 3bit

              79 4'd5:rx_temp_data [4] <= rs232_rx; // 4bit

              80 4'd6:rx_temp_data [5] <= rs232_rx; // 5bit

              81 4'd7:rx_temp_data [6] <= rs232_rx; // 6bit

              82 4'd8:rx_temp_data [7] <= rs232_rx; // 7bit

              83 default : ;

              84 endcase

              85 end

              86 else if( num == 4'd12 ) begin

              // 1+8+1(2)=11bit

              87 num <= 4'd0 ; // STOP ,num

              88 rx_data_r <= rx_temp_data ; // rx_data

              89 end

              90 end

              91

              92 assign rx_data = rx_data_r ;

              93

              94 endmodule

              第19行到第36行為起始位檢測部分,19到32行,實現(xiàn)了對rs232_rx端口上電平的連續(xù)四個時鐘周期的寄存,第36行則對這連續(xù)4個時鐘上升沿時的rs232_rx端口電平進(jìn)行邏輯操作,得出rs232_rx端口信號下降沿的到來。neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0,即后兩次寄存的狀態(tài)為低電平而前兩次寄存的裝填為高電平,則表明該端口上的信號發(fā)生了1->0的跳變,即有下降沿出現(xiàn)。neg_rs232_rx信號會產(chǎn)生一個周期的高脈沖。

              第43行至第55行則根據(jù)neg_rs232_rx和num計數(shù)值來控制串口接收波特率發(fā)生器的工作和接收中斷信號。第65行至第90行則采用線性序列機(jī)的設(shè)計方式,進(jìn)行一個字節(jié)的數(shù)據(jù)的接收。

              以上為對串口接收模塊的一個簡單分析,接下來,再進(jìn)行串口發(fā)送模塊的分析。

              1 module my_uart_tx (

              2 clk, rst_n ,

              3 rx_data , rx_int , rs232_tx ,

              4 clk_bps , bps_start

              5 );

              6

              7 input clk; // 50MHz

              8 input rst_n ; //

              9 input clk_bps ; // clk_bps_r ,

              10 input [ 7 : 0] rx_data ; //

              11 input rx_int ;

              12 output rs232_tx ; // RS232

              13 output bps_start ; //

              14

              15 //---------------------------------------------------------

              16 reg rx_int0 , rx_int1 , rx_int2 ; //rx_int

              17 wire neg_rx_int ; // rx_int

              18

              19 always @ ( posedge clk or negedge rst_n ) begin

              20 if(! rst_n ) begin

              21 rx_int0 <= 1'b0 ;

              22 rx_int1 <= 1'b0 ;

              23 rx_int2 <= 1'b0 ;

              24 end

              25 else begin

              26 rx_int0 <= rx_int ;

              27 rx_int1 <= rx_int0 ;

              28 rx_int2 <= rx_int1 ;

              29 end

              30 end

              31

              32 assign neg_rx_int = ~rx_int1 & rx_int2 ; // neg_rx_int

              33

              34 //---------------------------------------------------------

              35 reg[ 7 : 0] tx_data ; //

              36 //---------------------------------------------------------

              37 reg bps_start_r ;

              38 reg tx_en ; //

              39 reg[ 3: 0] num;

              40

              41 always @ ( posedge clk or negedge rst_n ) begin

              42 if(! rst_n ) begin

              43 bps_start_r <= 1'bz ;

              44 tx_en <= 1'b0 ;

              45 tx_data <= 8'd0 ;

              46 end

              47 else if( neg_rx_int ) begin //

              48 bps_start_r <= 1'b1 ;

              49 tx_data <= rx_data ; //

              50 tx_en <= 1'b1 ; //

              51 end

              52 else if( num==4'd11 ) begin //

              53 bps_start_r <= 1'b0 ;

              54 tx_en <= 1'b0 ;

              55 end

              56 end

              57

              58 assign bps_start = bps_start_r ;

              59

              60 //---------------------------------------------------------

              61 reg rs232_tx_r ;

              62

              63 always @ ( posedge clk or negedge rst_n ) begin

              64 if(! rst_n ) begin

              65 num <= 4'd0 ;

              66 rs232_tx_r <= 1'b1 ;

              67 end

              68 else if( tx_en ) begin

              69 if( clk_bps ) begin

              70 num <= num+1'b1 ;

              71 case ( num)

              72 4'd0 : rs232_tx_r <= 1'b0 ; //

              73 4'd1 : rs232_tx_r <= tx_data [0]; // bit0

              74 4'd2 : rs232_tx_r <= tx_data [1]; // bit1

              75 4'd3 : rs232_tx_r <= tx_data [2];// bit2

              76 4'd4 : rs232_tx_r <= tx_data [3]; // bit3

              77 4'd5 : rs232_tx_r <= tx_data [4];// bit4

              78 4'd6 : rs232_tx_r <= tx_data [5]; // bit5

              79 4'd7 : rs232_tx_r <= tx_data [6]; // bit6

              80 4'd8 : rs232_tx_r <= tx_data [7]; // bit7

              81 4'd9 : rs232_tx_r <= 1'b1 ; //

              82 default : rs232_tx_r <= 1'b1 ;

              83 endcase

              84 end

              85 else if( num==4'd11 ) num <= 4'd0 ; //

              86 end

              87 end

              88

              89 assign rs232_tx = rs232_tx_r ;

              90

              91 endmodule

              代碼19行到30行對串口接收模塊的接收中斷信號進(jìn)行了3次寄存,第32行則通過對連續(xù)兩次寄存結(jié)果的判斷,來檢測接收中斷信號rx_int的下降沿。如果有下降沿到來,neg_rx_int信號則會產(chǎn)生一個時鐘周期的高脈沖信號,第47行則通過對該信號的狀態(tài)判斷,來確定是否啟動發(fā)送波特率發(fā)生器模塊。如果檢測到了該高脈沖,則使能串口發(fā)送(tx_en <= 1'b1),同時將待發(fā)送的字節(jié)數(shù)據(jù)(rx_data)寄存到發(fā)送寄存器(tx_data)中。第52行,即計數(shù)到11后,表明一個字節(jié)的數(shù)據(jù)發(fā)送完成,此時停止發(fā)送波特率發(fā)生器的工作,同時禁止發(fā)送模塊的工作(tx_en <= 1'b0),即完成一個字節(jié)的數(shù)據(jù)的發(fā)送。

              第63行至第87行采用線性序列機(jī)設(shè)計方式,實現(xiàn)一個字節(jié)(自動添加起始位和停止位)的發(fā)送操作。

              以上就是對特權(quán)同學(xué)的串口代碼的一個簡單分析,頂層模塊就只進(jìn)行了一個簡單的例化和連線作用,因此小梅哥就不做分析了。小梅哥個人能力有限,可能存在理解不到位或者表述不專業(yè)的地方,不妥之處還望各位多多指出,以促進(jìn)共同學(xué)習(xí)??梢哉f,相對于淘寶網(wǎng)上漫天飛舞的開發(fā)板和五花八門的串口例程,特權(quán)同學(xué)的設(shè)計代碼相當(dāng)規(guī)范,架構(gòu)合理,思路清楚,確實是值得我們每一個愛好者學(xué)習(xí)。

             



            關(guān)鍵詞: FPGA 串口調(diào)試

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉