封装好的 Uart仿真测试模块---Uart接收和发送 虚拟模块(Version:02)

  1 //--------  仅供调试用的uart接收和发送 虚拟模块 ----------
  2 //  Version: 02                 Date:2012-05-10
  3 //  Desrip:  封装成MCU接口
  4 //  Author:  penglijun   
  5 //------- tx功能:被动工作(外部使能信号控制是否发送外部总线数据)
  6 //  tx_en:每1个上升沿启动1次串口发送
  7 //
  8 //------- rx功能:主动工作(自动检测rx下降沿并输出接收到的数据)
  9 //  rx     : 每1个下降沿启动1次串口接收 
 10 
 11 
 12 `timescale    1ns/1ns
 13 module UartSim
 14     (
 15         tx_en    ,        //外部使能信号(上跳沿有效)
 16         tx_data    ,       //外部总线待发送数据
 17         
 18         tx        ,        
 19         tx_ok    ,        //uart发送模块状态标识:0,正在发送; 1,空闲或发送完成
 20         
 21         rx        ,
 22         rx_data    ,       //uart接收到的数据
 23         rx_ok            //uart接收模块状态标识:0,正在接收; 1,空闲或接收完成
 24     );
 25     parameter Uart_BPS    =    32'd9600;
 26     
 27     input    tx_en        ;
 28     input[7:0] tx_data    ;
 29     output reg tx        ;
 30     output reg tx_ok    ;
 31     
 32     input    rx            ;
 33     output reg[7:0]    rx_data        ;
 34     output reg rx_ok    ;
 35     
 36     reg [31:0]BIT_TIME;
 37     
 38 
 39     initial
 40         begin
 41             case(Uart_BPS)
 42                 32'd9600    :    begin BIT_TIME    =    32'd104_167;    $display("%t %m Uart BPS = 9600",$time);end            
 43                 32'd19200    :    begin BIT_TIME    =    32'd052_083;    $display("%t %m Uart BPS = 19200",$time);end
 44                 32'd38400    :    begin BIT_TIME    =    32'd026_042;    $display("%t %m Uart BPS = 38400",$time);end
 45                 32'd57600    :    begin BIT_TIME    =    32'd017_361;    $display("%t %m Uart BPS = 57600",$time);end
 46                 32'd115200    :    begin BIT_TIME    =    32'd008_681;    $display("%t %m Uart BPS = 115200",$time);end
 47                 default:        begin BIT_TIME    =    32'd104_167;    $display("%t %m Uart BPS = 9600",$time);end
 48             endcase
 49         
 50         end
 51     
 52     initial
 53         begin
 54             tx        =    1;
 55             tx_ok    =    1;
 56             rx_ok    =    1;
 57             rx_data    =    8'dx;
 58             //tx_data    =    8'dx;
 59         end
 60     
 61 //-----MCU内部uart发送---------------    
 62     integer i=0;    
 63     always@(posedge tx_en)        //tx_en:上升沿启动一次串口发送
 64         begin
 65             tx_ok    =    0;               // Sent Start Flag:(negedge tx_ok)
 66             tx        =    0;               //    Start Bit
 67             #(BIT_TIME);
 68             for(i=0;i<8;i=i+1)
 69                 begin
 70                     tx    =    tx_data[i]    ;        //    Data Bit
 71                     #(BIT_TIME);                
 72                 end
 73             tx        =    1;               //    Stop Bit
 74             #(BIT_TIME);
 75             tx_ok    =    1;               //Sent Finish Flag:(posedge tx_ok)
 76         end
 77 
 78 //-----MCU内部uart接收---------------    
 79     integer j=0;
 80     always@(negedge rx)    //rx:下降沿启动一次串口接收
 81         begin
 82             if(rx_ok==1)    //整个的数据串的第一个rx下跳沿,才是开始位
 83             begin
 84                 rx_data    =    8'dx;        //接收数据寄存器重新初始化
 85                 rx_ok    =    0;
 86                 #(BIT_TIME/2);
 87                 if(rx!=0)                //Strat bit check
 88                     begin
 89                         $display("%t%m:---rx line start bit abnormal! simulation exit!",$time);
 90                         $stop;
 91                     end
 92                 else
 93                     begin
 94                         for(j=0;j<8;j=j+1)                //Data bits latch
 95                             begin
 96                                 #(BIT_TIME);
 97                                 rx_data[j]    =    rx;
 98                             end
 99                         #(BIT_TIME);
100                         if(rx==0)            //Stop bit check
101                             begin
102                                 $display("%t%m:---rx line stop bit abnormal! simulation exit!",$time);
103                                 $stop;
104                             end
105                         #(BIT_TIME/2);
106                         rx_ok    =    1;
107                 end
108             end
109         end
110 endmodule
posted @ 2012-05-10 11:05  fishplj2000  阅读(834)  评论(0编辑  收藏  举报