3492|3

5979

帖子

8

TA的资源

版主

楼主
 

【Altera SoC体验之旅】多串口服务器之串口模块设计(1) [复制链接]

  本帖最后由 chenzhufly 于 2015-6-1 00:51 编辑

作者:chenzhufly  QQ:36886052
1、  硬件环境
硬件平台:Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
          Quartus 14.0

2、代码结构
      我不生产代码,我只是代码的搬运工,代码来源于网络,分享与网络但还是需要做一些修改才能使用,慢慢来吧,结构还是不错的,我们一起学习学习。
      主要有三个文件uart_top.v,uart_xmit. v,uart_rcv. v,结构如下:

1)uart_top.v是串口逻辑模块的顶层文件,负责管理串口的发送和接收
2)uart_xmit. v为串口的发送模块
3)uart_rcv. v位串口的接收模块

3、代码分析
1)uart_top.v
可以清楚的看到在,在接收模块和发送模块的前端都加了fifo模块,深度为256个字节。
  1. `timescale 1 ns / 10 ps         

  2. `define BAUD_DIV 6875

  3. module uart_top  
  4. (

  5.         // Global signal definition
  6.         input                                                rst                                ,
  7.         input                                                sys_clk                        ,
  8.         input                                                pci_clk                        ,
  9.          
  10.         input                                                pci_wren                ,
  11.         input        [7:0]                                pci_wrdat                ,
  12.         input                                                pci_rden                ,
  13.         output        [7:0]                                pci_rddat                ,
  14.                                                          
  15.         // Local bus register               
  16.         input                                                SEND_CMD                ,        
  17.         input                                                RCV_EN                        ,   
  18.         output                                                RCV_IRQ                        ,   
  19.         input                                                PARITY_BIT_EN        ,         
  20.         input                                                PARITY_SEL                ,         
  21.         output                                                PARITY_ERROR        ,
  22.         //output                      uart_ok       ,           
  23.         output                      xmit_busy       ,
  24.         output                      xmit_ok         ,
  25.         output                      xmit_fifo_empty ,
  26.         output                                                rcv_fifo_empty        ,
  27.          
  28.         // Uart interface
  29.         input                                                rxd                                ,
  30.         output                                                txd                                 
  31. );                                         
  32.    
  33.         wire                                                xmit_fifo_rden;
  34.         wire                [7:0]                        xmit_fifo_rddat;
  35.          
  36.         wire                                                rcv_fifo_wren;
  37.         wire                [7:0]                        rcv_fifo_wrdat;
  38.         //wire                                                rcv_fifo_empty;
  39.          
  40.         /*---------------------------------------------------------------------  
  41.         --  transmit module instantiation                        
  42.         ----------------------------------------------------------------------*/         
  43.          
  44.         T_FIFO_256x8        xmit_fifo_256x8
  45.         (
  46.                 .din                        (pci_wrdat                ),
  47.                 .rd_clk             (sys_clk                ),
  48.                 .rd_en              (xmit_fifo_rden        ),
  49.                 .rst                (1'b0                        ),
  50.                 .wr_clk                 (pci_clk                ),
  51.                 .wr_en              (pci_wren                ),
  52.                 .almost_empty       (                                ),
  53.                 .almost_full        (                                ),
  54.                 .dout               (xmit_fifo_rddat),
  55.                 .empty              (xmit_fifo_empty),
  56.                 .full               (                                )
  57.         );

  58.         uart_xmit uart_xmit_inst
  59.         (
  60.                 .sys_clk                (sys_clk                ),
  61.                 .rst                        (rst                        ),
  62.                  
  63.                 // PCI command interface                                                     
  64.                 .SEND_CMD                (SEND_CMD                ),         
  65.                 .PARITY_BIT_EN        (PARITY_BIT_EN        ),        // parity bit enable or not, 1 = enable, 0 = disable;  
  66.                 .PARITY_SEL                (PARITY_SEL                ),         // determine ODD/EVEN parity, 1 = ODD,        1 = EVEN;         
  67.                  
  68.                 // UART command data fifofer interface
  69.                 .fifo_rden                (xmit_fifo_rden        ),         
  70.                 .fifo_rddat                (xmit_fifo_rddat),
  71.                 .fifo_empty                (xmit_fifo_empty),
  72.                  
  73.                 // UART status interface
  74.                 .uart_busy                (xmit_busy                ),         
  75.                 .uart_ok                (xmit_ok                ),
  76.                  
  77.                 // UART interface
  78.                 .txd                        (txd                        )         
  79.         );
  80.          
  81.         /*---------------------------------------------------------------------  
  82.         --  receive module instantiation                        
  83.         ----------------------------------------------------------------------*/         
  84.          
  85.         T_FIFO_256x8        rcv_fifo_256x8
  86.         (
  87.                 .din                        (rcv_fifo_wrdat        ),
  88.                 .rd_clk             (sys_clk                ),
  89.                 .rd_en              (pci_rden                ),
  90.                 .rst                (1'b0                        ),
  91.                 .wr_clk                 (sys_clk                ),
  92.                 .wr_en              (rcv_fifo_wren        ),   
  93.                 .almost_empty       (                                ),   
  94.                 .almost_full        (                                ),
  95.                 .dout               (pci_rddat                ),
  96.                 .empty              (rcv_fifo_empty        ),
  97.                 .full               (                                )
  98.         );
  99.          
  100.         uart_rcv uart_rcv_inst
  101.         (
  102.                 .sys_clk                (sys_clk                ),
  103.                 .rst                        (rst                        ),
  104.                  
  105.                 // PCI command interface      
  106.                 .RCV_EN                        (RCV_EN                        ),                                               
  107.                 .RCV_IRQ                (RCV_IRQ                ),  
  108.                 .PARITY_BIT_EN        (PARITY_BIT_EN        ),        // parity bit enable or not, 1 = enable, 0 = disable;  
  109.                 .PARITY_SEL                (PARITY_SEL                ),         // determine ODD/EVEN parity, 1 = ODD,        1 = EVEN;           
  110.                 .PARITY_ERROR        (PARITY_ERROR        ),   
  111.                  
  112.                 // UART command data fifofer interface
  113.                 .fifo_wren                (rcv_fifo_wren        ),         
  114.                 .fifo_wrdat                (rcv_fifo_wrdat        ),
  115.                 .fifo_empty                (rcv_fifo_empty        ),
  116.                  
  117.                 // UART interface, which should be registered before internal access
  118.                 .rxd                        (rxd                        )
  119.          
  120.         );
  121.          
  122. endmodule
复制代码

2)
uart_xmit. v

串口发送协议的解析和处理
  1. `timescale 1 ns / 10 ps         

  2. `define BAUD_DIV 6875

  3. module uart_xmit  
  4. (
  5.         input                                                sys_clk                        ,
  6.         input                                                rst                                ,
  7.          
  8.         // PCI command interface                                                     
  9.         input                                                SEND_CMD                ,         
  10.         input                                                PARITY_BIT_EN        ,        // parity bit enable or not, 1 = enable, 0 = disable;  
  11.         input                                                PARITY_SEL                ,         // determine ODD/EVEN parity, 1 = ODD,        1 = EVEN;         
  12.          
  13.         // UART command data fifofer interface
  14.         output        reg                                        fifo_rden                ,         
  15.         input                        [7:0]                fifo_rddat                ,
  16.         input                                                fifo_empty                ,
  17.          
  18.         // UART status interface
  19.         output        reg                                        uart_busy                ,         
  20.         output        reg                                        uart_ok                        ,
  21.          
  22.         // UART interface
  23.         output        reg                                        txd                        

  24. );

  25.         parameter frame_idle = 3'b000, frame_putchar = 3'b001, frame_bit_call = 3'b010, frame_done = 3'b011;
  26.         parameter bit_idle = 3'b000, bit_start = 3'b001, bit_xmit = 3'b010, bit_parity = 3'b011, bit_stop = 3'b100;
  27.          
  28.         reg                [2:0]        cur_frame;
  29.         reg                [2:0]        next_frame;
  30.          
  31.         reg                [2:0]        cur_bit;
  32.         reg                [2:0]        next_bit;                 

  33.         reg                [7:0]        xmit_char;  
  34.         reg                                xmit_start;
  35.         reg                                xmit_done;   
  36.          
  37.         reg                [3:0]        bit_cnt;
  38.         reg                                bit_over;
  39.         reg                [15:0]        baud_cnt;
  40.         reg                                shift_en;

  41.         /*---------------------------------------------------------------------
  42.         --  uart byte frame state control state machine
  43.         ----------------------------------------------------------------------*/
  44.         always [url=home.php?mod=space&uid=496176]@[/url] ( * )
  45.         begin
  46.                 case ( cur_frame )
  47.                         frame_idle:         
  48.                                 if ( SEND_CMD == 1'b1 )        // put frame char when pci send command event detected         
  49.                                 //if ( fifo_empty == 1'b0 )
  50.                                         next_frame <= frame_putchar;
  51.                                 else
  52.                                         next_frame <= frame_idle;
  53.                         frame_putchar:
  54.                                 //if ( char_over == 1'b1 )
  55.                                 if ( fifo_empty == 1'b1 )
  56.                                         next_frame <= frame_done;
  57.                                 else
  58.                                         next_frame <= frame_bit_call;  
  59.                         frame_bit_call:
  60.                             if ( xmit_done == 1'b0 )
  61.                                 next_frame <= frame_bit_call;
  62.                             else if ( fifo_empty == 1'b1 )
  63.                                 next_frame <= frame_idle;
  64.                             else
  65.                                 next_frame <= frame_putchar;
  66.                                 //if ( xmit_done == 1'b1 )
  67.                                 //        next_frame <= frame_putchar;
  68.                                 //else
  69.                                 //        next_frame <= frame_bit_call;
  70.                         frame_done:
  71.                                         next_frame <= frame_idle;
  72.                         default:
  73.                                         next_frame <= frame_idle;
  74.                 endcase
  75.         end
  76.          
  77.         always @ ( negedge rst or posedge sys_clk )     
  78.         begin
  79.                 if ( rst == 1'b0 )
  80.                         cur_frame <= frame_idle;
  81.                 else
  82.                         cur_frame <= next_frame;
  83.         end
  84.          
  85.         always @ ( negedge rst or posedge sys_clk )     
  86.         begin
  87.                 if ( rst == 1'b0 )
  88.                         xmit_start <= 1'b0;
  89.                 else
  90.                         if ( cur_frame == frame_putchar )
  91.                                 xmit_start <= 1'b1;
  92.                         else
  93.                                 xmit_start <= 1'b0;
  94.         end         
  95.          
  96.         /*---------------------------------------------------------------------
  97.         --  uart byte frame state control state machine
  98.         ----------------------------------------------------------------------*/
  99.         always @ ( * )
  100.         begin
  101.                 case ( cur_bit )
  102.                         bit_idle:
  103.                                 if ( xmit_start == 1'b1 )
  104.                                         next_bit <= bit_start;
  105.                                 else
  106.                                         next_bit <= bit_idle;
  107.                         bit_start:
  108.                                 if ( shift_en == 1'b1 )
  109.                                         next_bit <= bit_xmit;
  110.                                 else
  111.                                         next_bit <= bit_start;
  112.                         bit_xmit:
  113.                                 if ( bit_over == 1'b0 )
  114.                                         next_bit <= bit_xmit;
  115.                                 else if ( PARITY_BIT_EN == 1'b1 )
  116.                                         next_bit <= bit_parity;  
  117.                                 else  
  118.                                         next_bit <= bit_stop;
  119.                         bit_parity:
  120.                                 if ( shift_en == 1'b0 )
  121.                                         next_bit <= bit_parity;
  122.                                 else  
  123.                                         next_bit <= bit_stop;
  124.                         bit_stop:
  125.                                 if ( shift_en == 1'b1 )
  126.                                         next_bit <= bit_idle;
  127.                                 else
  128.                                         next_bit <= bit_stop;
  129.                         default:
  130.                                 next_bit <= bit_idle;
  131.                 endcase
  132.         end
  133.          
  134.         always @ ( negedge rst or posedge sys_clk )     
  135.         begin
  136.                 if ( rst == 1'b0 )
  137.                         cur_bit <= bit_idle;
  138.                 else
  139.                         cur_bit <= next_bit;
  140.         end
  141.          
  142.         always @ ( negedge rst or posedge sys_clk )     
  143.         begin
  144.                 if ( rst == 1'b0 )
  145.                         xmit_done <= 1'b0;
  146.                 else
  147.                         if ( cur_bit == bit_stop && shift_en == 1'b1 )
  148.                                 xmit_done <= 1'b1;
  149.                         else
  150.                                 xmit_done <= 1'b0;
  151.         end
  152.          
  153.         /*---------------------------------------------------------------------
  154.         --  bit counter control
  155.         ----------------------------------------------------------------------*/
  156.         always @ ( negedge rst or posedge sys_clk )     
  157.         begin
  158.                 if ( rst == 1'b0 )
  159.                         bit_cnt <= 4'h0;
  160.                 else
  161.                         if ( cur_bit == bit_idle )
  162.                                 bit_cnt <= 4'h0;
  163.                         else if ( shift_en == 1'b1 )
  164.                                 bit_cnt <= bit_cnt + 1'b1;
  165.         end
  166.          
  167.         always @ ( negedge rst or posedge sys_clk )     
  168.         begin
  169.                 if ( rst == 1'b0 )
  170.                         bit_over <= 1'b0;
  171.                 else
  172.                         if ( cur_bit == bit_idle )
  173.                                 bit_over <= 1'b0;
  174.                         else if ( bit_cnt == 4'h9 )
  175.                                 bit_over <= 1'b1;
  176.         end         
  177.                  
  178.         /*---------------------------------------------------------------------
  179.         --  baud rate control
  180.         ----------------------------------------------------------------------*/
  181.         always @ ( negedge rst or posedge sys_clk )     
  182.         begin
  183.                 if ( rst == 1'b0 )
  184.                         baud_cnt <= 16'b0_0000_0000;
  185.                 else
  186.                         if ( cur_bit == bit_idle || baud_cnt == `BAUD_DIV )
  187.                                 baud_cnt <= 16'b0_0000_0000;
  188.                         else
  189.                                 baud_cnt <= baud_cnt + 1'b1;
  190.         end
  191.          
  192.         always @ ( negedge rst or posedge sys_clk )     
  193.         begin
  194.                 if ( rst == 1'b0 )
  195.                         shift_en <= 1'b0;
  196.                 else
  197.                         if ( baud_cnt == `BAUD_DIV )
  198.                                 shift_en <= 1'b1;
  199.                         else
  200.                                 shift_en <= 1'b0;
  201.         end
  202.          
  203.         /*---------------------------------------------------------------------
  204.         --  UART fifo interface
  205.         ----------------------------------------------------------------------*/         
  206.         always @ ( negedge rst or posedge sys_clk )     
  207.         begin
  208.                 if ( rst == 1'b0 )
  209.                         fifo_rden <= 1'b0;
  210.                 else
  211.                         fifo_rden <= xmit_start;
  212.         end
  213.          
  214.         /*---------------------------------------------------------------------
  215.         --  TXD controll logic
  216.         ----------------------------------------------------------------------*/         
  217.         always @ ( negedge rst or posedge sys_clk )     
  218.         begin
  219.                 if ( rst == 1'b0 )
  220.                         xmit_char <= 8'h00;
  221.                 else
  222.                         if ( cur_bit == bit_start )
  223.                                 xmit_char <= fifo_rddat;
  224.                         else if ( cur_bit == bit_xmit && shift_en == 1'b1 )
  225.                 //                xmit_char <= { xmit_char[6:0], xmit_char[7] };
  226.                                 xmit_char <= { xmit_char[0], xmit_char[7:1] };
  227.         end
  228.          
  229.         always @ ( negedge rst or posedge sys_clk )     
  230.         begin
  231.                 if ( rst == 1'b0 )
  232.                         txd <= 1'b1;
  233.                 else if ( shift_en == 1'b1 )
  234.                         case ( cur_bit )
  235.                                 bit_start :
  236.                                         txd <= 1'b0;
  237.                                 bit_xmit:
  238.                 //                        txd <= xmit_char[7];
  239.                                         txd <= xmit_char[0];
  240.                                 bit_parity:
  241.                                         txd <= ( xmit_char[7] ^ xmit_char[6] ^ xmit_char[5] ^ xmit_char[4] ^
  242.                                                      xmit_char[3] ^ xmit_char[2] ^ xmit_char[1] ^ xmit_char[0] ) ^ (~PARITY_SEL);
  243.                                 default:
  244.                                         txd <= 1'b1;
  245.                         endcase
  246.         end         
  247.          
  248.         always @ ( negedge rst or posedge sys_clk )     
  249.         begin
  250.                 if ( rst == 1'b0 )
  251.                         uart_ok <= 1'b0;
  252.                 else
  253.                         if ( SEND_CMD == 1'b1 )
  254.                                 uart_ok <= 1'b0;
  255.                         else if ( fifo_empty == 1'b1 && xmit_done == 1'b1 )
  256.                                 uart_ok <= 1'b1;
  257.         end         
  258.          
  259.         always @ ( negedge rst or posedge sys_clk )     
  260.         begin
  261.                 if ( rst == 1'b0 )
  262.                         uart_busy <= 1'b0;
  263.                 else
  264.                         if ( cur_frame == frame_idle )
  265.                                 uart_busy <= 1'b0;
  266.                         else if ( fifo_empty == 1'b0 )
  267.                                 uart_busy <= 1'b1;
  268.         end                                 
  269.                  
  270.                                          
  271. endmodule
复制代码

3)
uart_rcv. v
串口接收协议的解析和处理
  1. `timescale 1 ns / 10 ps         

  2. `define BAUD_DIV 6875

  3. module uart_rcv  
  4. (
  5.         input                                                sys_clk                        ,
  6.         input                                                rst                                ,
  7.          
  8.         // PCI command interface      
  9.         input                                                RCV_EN                        ,                                               
  10.         output                                                RCV_IRQ                        ,  
  11.         input                                                PARITY_BIT_EN        ,        // parity bit enable or not, 1 = enable, 0 = disable;  
  12.         input                                                PARITY_SEL                ,         // determine ODD/EVEN parity, 1 = ODD,        1 = EVEN;           
  13.         output        reg                                        PARITY_ERROR        ,   
  14.          
  15.         // UART command data fifofer interface
  16.         output        reg                                        fifo_wren                ,         
  17.         output        reg                [7:0]                fifo_wrdat                ,
  18.         input                                                fifo_empty                ,
  19.          
  20.         // UART interface, which should be registered before internal access
  21.         input                                                rxd                                         

  22. );

  23.         reg                                rxd_reg;
  24.         reg                                rxd_reg_sft;
  25.         reg                [7:0]        rxd_s0_cnt;
  26.         reg                [7:0]        rxd_s1_cnt;
  27.         reg                                rxd_anti_glitch;

  28.         reg                [2:0]        cur_bit;
  29.         reg                [2:0]        next_bit;
  30.         reg                [7:0]        rcv_char;
  31.         reg                                start_event;
  32.         reg                                start_event_dly;
  33.         reg                [3:0]        bit_cnt;
  34.         reg                                bit_over;
  35.         reg                [15:0]        baud_cnt;
  36.         reg                                shift_en;
  37.         reg                                sample_en;
  38.                  
  39.         parameter bit_idle = 3'b000, bit_start = 3'b001, bit_rcv = 3'b010, bit_parity = 3'b011, bit_stop = 3'b100;
  40.          
  41.         /*---------------------------------------------------------------------
  42.         --  rxd anti-glitch control
  43.         ----------------------------------------------------------------------*/
  44.         always @ ( negedge rst or posedge sys_clk )
  45.         begin
  46.                 if ( rst == 1'b0 )
  47.                         rxd_s0_cnt <= 0;
  48.                 else
  49.                         if ( rxd == 1'b1 )
  50.                                 rxd_s0_cnt <= 0;
  51.                         else if ( rxd_s0_cnt[4] == 1'b0 )
  52.                                 rxd_s0_cnt <= rxd_s0_cnt + 1'b1;
  53.         end
  54.          
  55.         always @ ( negedge rst or posedge sys_clk )
  56.         begin
  57.                 if ( rst == 1'b0 )
  58.                         rxd_s1_cnt <= 0;
  59.                 else
  60.                         if ( rxd == 1'b0 )
  61.                                 rxd_s1_cnt <= 0;
  62.                         else if ( rxd_s1_cnt[4] == 1'b0 )
  63.                                 rxd_s1_cnt <= rxd_s1_cnt + 1'b1;
  64.         end
  65.          
  66.         always @ ( negedge rst or posedge sys_clk )
  67.         begin
  68.                 if ( rst == 1'b0 )
  69.                         rxd_anti_glitch <= 1'b1;
  70.                 else
  71.                         if ( rxd_s0_cnt[4] == 1'b1 )
  72.                                 rxd_anti_glitch <= 1'b0;
  73.                         else if ( rxd_s1_cnt[4] == 1'b1 )
  74.                                 rxd_anti_glitch <= 1'b1;
  75.         end
  76.          
  77.         /*---------------------------------------------------------------------
  78.         --  start bit detection
  79.         ----------------------------------------------------------------------*/
  80.         always @ ( negedge rst or posedge sys_clk )
  81.         begin
  82.                 if ( rst == 1'b0 )
  83.                 begin
  84.                         rxd_reg <= 1'b1;
  85.                         rxd_reg_sft <= 1'b1;
  86.                 end
  87.                 else
  88.                 begin
  89.                         rxd_reg <= rxd_anti_glitch;
  90.                         rxd_reg_sft <= rxd_reg;
  91.                 end
  92.         end
  93.          
  94.         always @ ( negedge rst or posedge sys_clk )
  95.         begin
  96.                 if ( rst == 1'b0 )
  97.                         start_event <= 1'b0;
  98.                 else
  99.                         if ( rxd_reg == 1'b0 && rxd_reg_sft == 1'b1 &&  
  100.                              ( cur_bit == bit_idle || cur_bit == bit_stop ) )
  101.                                 start_event <= 1'b1;
  102.                         else
  103.                                 start_event <= 1'b0;
  104.         end
  105.          
  106.         always @ ( negedge rst or posedge sys_clk )
  107.         begin
  108.                 if ( rst == 1'b0 )
  109.                         start_event_dly <= 1'b0;
  110.                 else
  111.                         start_event_dly <= start_event;
  112.         end
  113.          
  114.         /*---------------------------------------------------------------------
  115.         --  uart byte frame state control state machine
  116.         ----------------------------------------------------------------------*/
  117.         always @ ( * )
  118.         begin
  119.                 case ( cur_bit )
  120.                         bit_idle:
  121.                                 if ( start_event == 1'b1 )
  122.                                         next_bit <= bit_start;
  123.                                 else
  124.                                         next_bit <= bit_idle;
  125.                         bit_start:
  126.                                 if ( shift_en == 1'b1 )
  127.                                         next_bit <= bit_rcv;
  128.                                 else
  129.                                         next_bit <= bit_start;
  130.                         bit_rcv:
  131.                                 if ( bit_over == 1'b0 )
  132.                                         next_bit <= bit_rcv;
  133.                                 else if ( PARITY_BIT_EN == 1'b1 )
  134.                                         next_bit <= bit_parity;  
  135.                                 else  
  136.                                         next_bit <= bit_stop;
  137.                         bit_parity:
  138.                                 if ( shift_en == 1'b0 )
  139.                                         next_bit <= bit_parity;
  140.                                 else  
  141.                                         next_bit <= bit_stop;
  142.                         bit_stop:
  143.                                 //if ( shift_en == 1'b1 )
  144.                                 //        next_bit <= bit_idle;
  145.                                 //else
  146.                                 //        next_bit <= bit_stop;
  147.                                 if ( start_event == 1'b1 ) // Caution!!! start_event will occur in bit_stop phase
  148.                                     next_bit <= bit_start;
  149.                                 else if ( shift_en == 1'b1 )
  150.                                     next_bit <= bit_idle;
  151.                                 else
  152.                                     next_bit <= bit_stop;
  153.                         default:
  154.                                 next_bit <= bit_idle;
  155.                 endcase
  156.         end
  157.          
  158.         always @ ( negedge rst or posedge sys_clk )     
  159.         begin
  160.                 if ( rst == 1'b0 )
  161.                         cur_bit <= bit_idle;
  162.                 else
  163.                         cur_bit <= next_bit;
  164.         end         
  165.          
  166.                  
  167.         /*---------------------------------------------------------------------
  168.         --  bit counter control
  169.         ----------------------------------------------------------------------*/
  170.         always @ ( negedge rst or posedge sys_clk )     
  171.         begin
  172.                 if ( rst == 1'b0 )
  173.                         bit_cnt <= 4'h0;
  174.                 else
  175.                         if ( cur_bit == bit_idle || ( cur_bit == bit_stop && start_event == 1'b1 ) )
  176.                                 bit_cnt <= 4'h0;
  177.                         //else if ( shift_en == 1'b1 )
  178.                         else if ( shift_en == 1'b1 && start_event_dly == 1'b0 ) // modified by andrew, 2007-5-24 11:46
  179.                                 bit_cnt <= bit_cnt + 1'b1;
  180.         end
  181.          
  182.         always @ ( negedge rst or posedge sys_clk )     
  183.         begin
  184.                 if ( rst == 1'b0 )
  185.                         bit_over <= 1'b0;
  186.                 else
  187.                     if ( cur_bit == bit_idle || ( cur_bit == bit_stop && start_event == 1'b1 ) )
  188.                                 bit_over <= 1'b0;
  189.                         else if ( bit_cnt == 4'h9 )
  190.                                 bit_over <= 1'b1;
  191.         end         
  192.          
  193.         /*---------------------------------------------------------------------
  194.         --  baud rate control
  195.         ----------------------------------------------------------------------*/
  196.         always @ ( negedge rst or posedge sys_clk )     
  197.         begin
  198.                 if ( rst == 1'b0 )
  199.                         baud_cnt <= 9'b0_0000_0000;
  200.                 else
  201.                         //if ( cur_bit == bit_idle || baud_cnt == `BAUD_DIV )
  202.                         if ( cur_bit == bit_idle ||  
  203.                            ( cur_bit == bit_stop && start_event == 1'b1 ) ||  
  204.                              baud_cnt == `BAUD_DIV ) // to avoid error to be accumulated!!!!!
  205.                                 baud_cnt <= 9'b0_0000_0000;
  206.                         else
  207.                                 baud_cnt <= baud_cnt + 1'b1;
  208.         end
  209.          
  210.         always @ ( negedge rst or posedge sys_clk )     
  211.         begin
  212.                 if ( rst == 1'b0 )
  213.                         shift_en <= 1'b0;
  214.                 else
  215.                         if ( baud_cnt == `BAUD_DIV )
  216.                                 shift_en <= 1'b1;
  217.                         else
  218.                                 shift_en <= 1'b0;
  219.         end
  220.          
  221.         always @ ( negedge rst or posedge sys_clk )     
  222.         begin
  223.                 if ( rst == 1'b0 )
  224.                         sample_en <= 1'b0;
  225.                 else
  226.                         if ( baud_cnt == (`BAUD_DIV >> 1) )
  227.                                 sample_en <= 1'b1;
  228.                         else
  229.                                 sample_en <= 1'b0;
  230.         end
  231.          
  232.          
  233.         /*---------------------------------------------------------------------
  234.         --  Character received from uart interface
  235.         ----------------------------------------------------------------------*/
  236.         always @ ( negedge rst or posedge sys_clk )     
  237.         begin
  238.                 if ( rst == 1'b0 )
  239.                         rcv_char <= 8'h00;
  240.                 else
  241.                         if ( cur_bit == bit_rcv && sample_en == 1'b1 )
  242.                                 //rcv_char <= { rcv_char[6:0], rxd_reg };
  243.                                 rcv_char <= { rxd_reg, rcv_char[7:1] };
  244.         end
  245.          
  246.         /*
  247.         always @ ( negedge rst or posedge sys_clk )     
  248.         begin
  249.                 if ( rst == 1'b0 )
  250.                         PARITY_ERROR <= 1'b0;
  251.                 else
  252.                         if ( cur_bit == bit_parity && shift_en == 1'b1 )
  253.                                 PARITY_ERROR <= ( rxd_reg == ( getchar[7] ^ getchar[6] ^ getchar[5] ^ getchar[4] ^
  254.                                                                getchar[3] ^ getchar[2] ^ getchar[1] ^ getchar[0] ) ^ (~PARITY_SEL)
  255.                                                 ) ? 1'b0 : 1'b1;
  256.         end         
  257.         */
  258.          
  259.         /*---------------------------------------------------------------------
  260.         --  FIFO control logic
  261.         ----------------------------------------------------------------------*/
  262.         always @ ( negedge rst or posedge sys_clk )     
  263.         begin
  264.                 if ( rst == 1'b0 )
  265.                         fifo_wren <= 1'b0;
  266.                 else
  267.                         if ( cur_bit == bit_stop && ( shift_en == 1'b1 || start_event == 1'b1 ) )
  268.                                 fifo_wren <= 1'b1;
  269.                         else
  270.                                 fifo_wren <= 1'b0;
  271.         end
  272.          
  273.         always @ ( negedge rst or posedge sys_clk )     
  274.         begin
  275.                 if ( rst == 1'b0 )
  276.                         fifo_wrdat <= 0;
  277.                 else
  278.                         fifo_wrdat <= rcv_char;
  279.         end         
  280.          
  281.         assign RCV_IRQ = ~fifo_empty;

  282. endmodule
复制代码

4、小结
1)这里主要展示了一下串口模块的逻辑和结构,不过还需要进一步的仿真和测试;
2)中断处理部分还没加进来。


此帖出自Altera SoC论坛

最新回复

可以把 每个模块生成一个图形   顶层直接用图像形式显示方便理解   详情 回复 发表于 2015-6-3 20:30
点赞 关注
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复
举报

542

帖子

71

TA的资源

纯净的硅(中级)

沙发
 
从头到尾看了一遍,虽然不明白,但是不明觉厉
此帖出自Altera SoC论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

155

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
支持
此帖出自Altera SoC论坛
个人签名http://www.tdhj.cn
 
 
 

回复

639

帖子

0

TA的资源

一粒金砂(高级)

4
 
可以把 每个模块生成一个图形   顶层直接用图像形式显示方便理解
此帖出自Altera SoC论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表