找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2897|回復(fù): 1
收起左側(cè)

FPGA實(shí)現(xiàn)UART收發(fā)數(shù)據(jù) verilog程序

[復(fù)制鏈接]
ID:909289 發(fā)表于 2021-4-20 20:37 | 顯示全部樓層 |閱讀模式
uart用verilog實(shí)現(xiàn)串口調(diào)試助手通信
  1. `timescale 1ns / 1ps
  2. ////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    17:11:32 08/28/08
  7. // Design Name:   
  8. // Module Name:    my_uart_rx
  9. // Project Name:   
  10. // Target Device:  
  11. // Tool versions:  
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. ////////////////////////////////////////////////////////////////////////////////
  21. module uart_rx(
  22.                                 clk,rst_n,
  23.                                 rs232_rx,rx_data,rx_int,
  24.                                 rx_finish,        //cong add
  25.                                 clk_bps,bps_start
  26.                         );

  27. input clk;                // 50MHz主時鐘
  28. input rst_n;        //低電平復(fù)位信號
  29. input rs232_rx;        // RS232接收數(shù)據(jù)信號
  30. input clk_bps;        // clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)
  31. output bps_start;                //接收到數(shù)據(jù)后,波特率時鐘啟動信號置位
  32. output[7:0] rx_data;        //接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到
  33. output rx_int;        //接收數(shù)據(jù)中斷信號,接收到數(shù)據(jù)期間始終為高電平
  34. output rx_finish;        //cong add

  35. //----------------------------------------------------------------
  36. reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;        //接收數(shù)據(jù)寄存器,濾波用
  37. wire neg_rs232_rx;        //表示數(shù)據(jù)線接收到下降沿

  38. always @ (posedge clk or negedge rst_n) begin
  39.         if(!rst_n) begin
  40.                         rs232_rx0 <= 1'b0;
  41.                         rs232_rx1 <= 1'b0;
  42.                         rs232_rx2 <= 1'b0;
  43.                         rs232_rx3 <= 1'b0;
  44.                 end
  45.         else begin
  46.                         rs232_rx0 <= rs232_rx;
  47.                         rs232_rx1 <= rs232_rx0;
  48.                         rs232_rx2 <= rs232_rx1;
  49.                         rs232_rx3 <= rs232_rx2;
  50.                 end
  51. end
  52.         //下面的下降沿檢測可以濾掉<20ns-40ns的毛刺(包括高脈沖和低脈沖毛刺),
  53.         //這里就是用資源換穩(wěn)定(前提是我們對時間要求不是那么苛刻,因?yàn)檩斎胄盘柎蛄撕脦着模?
  54.         //(當(dāng)然我們的有效低脈沖信號肯定是遠(yuǎn)遠(yuǎn)大于40ns的)
  55. assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;        //接收到下降沿后neg_rs232_rx置高一個時鐘周期

  56. //----------------------------------------------------------------
  57. reg bps_start_r;
  58. reg[3:0] num;        //移位次數(shù)
  59. reg rx_int;                //接收數(shù)據(jù)中斷信號,接收到數(shù)據(jù)期間始終為高電平

  60. always @ (posedge clk or negedge rst_n)
  61.         if(!rst_n) begin
  62.                         //cong//bps_start_r <= 1'bz;
  63.                         bps_start_r <= 1'b0;
  64.                         rx_int <= 1'b0;
  65.                 end
  66.         else if(neg_rs232_rx) begin                //接收到串口接收線rs232_rx的下降沿標(biāo)志信號
  67.                         bps_start_r <= 1'b1;        //啟動串口準(zhǔn)備數(shù)據(jù)接收
  68.                         rx_int <= 1'b1;                        //接收數(shù)據(jù)中斷信號使能
  69.                 end
  70.         //cong//else if(num==4'd12) begin                //接收完有用數(shù)據(jù)信息
  71.         else if(num==4'd10) begin                //接收完有用數(shù)據(jù)信息
  72.                         bps_start_r <= 1'b0;        //數(shù)據(jù)接收完畢,釋放波特率啟動信號
  73.                         rx_int <= 1'b0;                        //接收數(shù)據(jù)中斷信號關(guān)閉
  74.                 end

  75. assign bps_start = bps_start_r;

  76. //----------------------------------------------------------------
  77. reg[7:0] rx_data_r;                //串口接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到
  78. //----------------------------------------------------------------

  79. reg[7:0] rx_temp_data;        //當(dāng)前接收數(shù)據(jù)寄存器

  80. always @ (posedge clk or negedge rst_n)
  81.         if(!rst_n) begin
  82.                         rx_temp_data <= 8'd0;
  83.                         num <= 4'd0;
  84.                         rx_data_r <= 8'd0;
  85.                 end
  86.         else if(rx_int) begin        //接收數(shù)據(jù)處理
  87.                 if(clk_bps) begin        //讀取并保存數(shù)據(jù),接收數(shù)據(jù)為一個起始位,8bit數(shù)據(jù),1或2個結(jié)束位               
  88.                                 num <= num+1'b1;
  89.                                 case (num)
  90.                                                 4'd1: rx_temp_data[0] <= rs232_rx;        //鎖存第0bit
  91.                                                 4'd2: rx_temp_data[1] <= rs232_rx;        //鎖存第1bit
  92.                                                 4'd3: rx_temp_data[2] <= rs232_rx;        //鎖存第2bit
  93.                                                 4'd4: rx_temp_data[3] <= rs232_rx;        //鎖存第3bit
  94.                                                 4'd5: rx_temp_data[4] <= rs232_rx;        //鎖存第4bit
  95.                                                 4'd6: rx_temp_data[5] <= rs232_rx;        //鎖存第5bit
  96.                                                 4'd7: rx_temp_data[6] <= rs232_rx;        //鎖存第6bit
  97.                                                 4'd8: rx_temp_data[7] <= rs232_rx;        //鎖存第7bit
  98.                                                 default: ;
  99.                                         endcase
  100.                         end
  101.                 //cong//else if(num == 4'd12) begin                //我們的標(biāo)準(zhǔn)接收模式下只有1+8+1(2)=11bit的有效數(shù)據(jù)
  102.                 else if(num == 4'd10) begin                //我們的標(biāo)準(zhǔn)接收模式下只有1+8+1(2)=11bit的有效數(shù)據(jù)
  103.                                 num <= 4'd0;                        //接收到STOP位后結(jié)束,num清零
  104.                                 rx_data_r <= rx_temp_data;        //把數(shù)據(jù)鎖存到數(shù)據(jù)寄存器rx_data中
  105.                         end
  106.                 end

  107. assign rx_data = rx_data_r;
  108. //assign rx_finish = num==4'd10;        //cong add
  109. reg rx_int_1t;
  110. always @ (posedge clk or negedge rst_n)begin
  111.         if(!rst_n) begin
  112.                 rx_int_1t <= 1'b0;
  113.         end
  114.         else begin
  115.                 rx_int_1t <= rx_int;
  116.         end
  117. end
  118. assign rx_finish = ~rx_int & rx_int_1t;

  119. endmodule
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:857680 發(fā)表于 2021-5-25 16:59 | 顯示全部樓層
一次接收一個字符么?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表