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