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
相关文章: