封装好的 Uart仿真测试模块

 1 //----------------------UartSim------------------------------
2
3 // V001 :2012-02-12 PLJ 封装 UartSim为V001 包含发送和接收 模块
4 // V002 : 2012-02-12 PLJ 修改1 接收模块中的延时(1/2*BIT_TIME)为(BIT_TIME/2)
5 // 修改2 接收模块中的for循环i<=8 为 i<8
6 // 修改3 接收模块中入口处增加循环变量k的初始化k=0
7 // 注意: 1/2*time=0*time 而不是0.5*time
8 `timescale 1ns/1ns
9
10 module UartSim
11 (
12 tx ,
13 tx_ok ,
14 rx ,
15 rx_ok
16 );
17 parameter Uart_BPS = 32'd9600;
18
19 output reg tx ;
20 output reg tx_ok;
21 input rx;
22 output reg rx_ok;
23
24 reg [7:0]rx_data;
25 // reg [7:0]tx_data;
26 reg [31:0]BIT_TIME;
27
28
29 initial
30 begin
31 case(Uart_BPS)
32 32'd9600: BIT_TIME = 32'd104_167;
33
34 default: BIT_TIME = 32'd104_167;
35 endcase
36
37 end
38
39 initial
40 begin
41 tx = 1;
42 tx_ok = 1;
43 rx_ok = 1;
44 rx_data = 8'dx;
45 //tx_data = 8'dx;
46 end
47
48
49 integer i;
50 task tx_data_task;
51 input [7:0]tx_data ;
52 begin
53 tx_ok = 0; // Sent Start Flag:(negedge tx_ok)
54 tx = 0; // Start Bit
55 #(BIT_TIME);
56 for(i=0;i<8;i=i+1)
57 begin
58 tx = tx_data[i] ; // Data Bit
59 #(BIT_TIME);
60 end
61 tx = 1; // Stop Bit
62 #(BIT_TIME);
63 tx_ok = 1; //Sent Finish Flag:(posedge tx_ok)
64 end
65 endtask
66
67 integer j;
68 always@(negedge rx)
69 begin
70 if(rx_ok==1) //整个的数据串的第一个rx下跳沿,才是开始位
71 begin
72 j=0;
73 rx_data = 8'dx; //接收数据寄存器重新初始化
74 rx_ok = 0;
75 #(BIT_TIME/2);// 1/2*time=0*time 而不是0.5*time
76 if(rx!=0) //Strat bit check
77 begin
78 $display("%t%m:---rx line start bit abnormal! simulation exit!",$time);
79 $stop;
80 end
81 else
82 begin
83 for(j=0;j<8;j=j+1) //Data bits latch
84 begin
85 #(BIT_TIME);
86 rx_data[j] = rx;
87 end
88 #(BIT_TIME);
89 if(rx==0) //Stop bit check
90 begin
91 $display("%t%m:---rx line stop bit abnormal! simulation exit!",$time);
92 $stop;
93 end
94 #(BIT_TIME/2);
95 rx_ok = 1;
96 end
97 end
98 end
99 endmodule
posted @ 2012-03-01 15:00  fishplj2000  阅读(539)  评论(0)    收藏  举报