MCU总线读写仿真模块
MCU总线 读写仿真模块
1 `timescale 1ns/1ns
2
3 module MCU_RW
4 (
5 mcu_cs_n ,
6 mcu_wr_n , //下降沿触发写
7 mcu_rd_n , //下降沿触发读
8 mcu_addr ,
9 mcu_data
10
11 );
12 parameter DATAWIDTH = 16;
13 parameter ADDRWIDTH = 2;//4
14 parameter Tad_ws = 40 ; //地址、数据的写建立时间
15 parameter Tad_wh = 100 ; //地址、数据的写保持时间
16 parameter Tad_rs = 40 ; //地址的读建立时间
17 parameter Tad_rh = 120 ; //地址的读保持时间
18
19
20 output reg mcu_cs_n ;
21 output reg mcu_wr_n ;
22 output reg mcu_rd_n ;
23 output reg[ADDRWIDTH-1:0] mcu_addr ;
24 output reg[DATAWIDTH-1:0] mcu_data ;
25
26 initial
27 begin
28 mcu_cs_n = 'b0 ;
29 mcu_wr_n = 'b1 ;
30 mcu_rd_n = 'b1 ;
31 mcu_addr = 'bx ;
32 mcu_data = 'bx ;
33 end
34
35 task mcu_bus_write;
36 input [ADDRWIDTH-1:0] addr ;
37 input [DATAWIDTH-1:0] data ;
38 begin
39 mcu_cs_n = 1'b0 ;
40 mcu_wr_n = 1'b1 ;
41 mcu_addr = addr ;
42 mcu_data = data ;
43 #Tad_ws ; //地址、数据的写建立时间
44 mcu_wr_n = 1'b0 ; // 下降沿触发写
45 #Tad_wh ; //地址、数据的写保持时间
46 mcu_wr_n = 1'b1 ;
47 end
48 endtask
49
50 task mcu_bus_read;
51 input [ADDRWIDTH-1:0] addr ;
52 begin
53 mcu_cs_n = 1'b0 ;
54 mcu_wr_n = 1'b1 ;
55 mcu_rd_n = 1'b1 ;
56 mcu_addr = addr ;
57 #Tad_rs ; //地址的读建立时间
58 mcu_rd_n = 1'b0 ; // 下降沿触发读
59 #Tad_rh ; //地址的读保持时间
60 mcu_rd_n = 1'b1 ;
61 end
62 endtask
63
64 endmodule
65
66
67 /*************使用说明*********************
68 //----------- MCU_RW模块例化 -----------
69 wire mcu_cs_n ;
70 wire mcu_wr_n ;
71 wire mcu_rd_n ;
72 wire[ 1:0] mcu_addr ;
73 wire[15:0] mcu_data ;
74
75 MCU_RW i_MCU_RW
76 (
77 .mcu_cs_n (mcu_cs_n ),
78 .mcu_wr_n (mcu_wr_n ),
79 .mcu_rd_n (mcu_rd_n ),
80 .mcu_addr (mcu_addr ),
81 .mcu_data (mcu_data )
82 );
83 defparam i_MCU_RW.Tad_ws = 5 ; //地址、数据的写建立时间
84 defparam i_MCU_RW.Tad_wh = 22 ; //地址、数据的写保持时间
85
86 i_MCU_RW.mcu_bus_write(addr , data); //写
87 i_MCU_RW.mcu_bus_read (addr ); //读
88 *******************************************/