MC8051的顶层自定义封装

通过宏定义选择并行端口是封装成双向端口还是单向端口

 

  1 // 若并行端口封装成双向端口:
2 // 1. 要输出高电平,必须在双向端口外部加上拉电阻(高电平由上拉电源)产生
3 // 2. 要作输入端口,必须先向内核输出端口写1
4 //
5
6 //`define port_is_bidir 1
7
8 module mc8051 (
9 sys_clk , // 系统时钟18Mhz
10 sys_rst_n , // 系统复位,Low_L有效
11 sys_int0_i , // 外部中断0
12 sys_int1_i , // 外部中断1
13 sys_all_t0_i , // 定时器、计数器T/C0
14 sys_all_t1_i , // 定时器、计数器T/C0
15 sys_all_rxd_i , //
16
17 `ifdef port_is_bidir
18 sys_p0_bd , // 双向端口P0
19 sys_p1_bd , // 双向端口P1
20 sys_p2_bd , // 双向端口P2
21 sys_p3_bd , // 双向端口P3
22 `else
23 sys_p0_i , // 单向端口P0
24 sys_p1_i , // 单向端口P1
25 sys_p2_i , // 单向端口P2
26 sys_p3_i , // 单向端口P3
27 sys_p0_o , // 单向端口P0
28 sys_p1_o , // 单向端口P1
29 sys_p2_o , // 单向端口P2
30 sys_p3_o , // 单向端口P3
31 `endif
32 sys_all_rxd_o , //
33 sys_all_txd_o , //
34 sys_all_rxdwr_o //
35 );
36 input sys_clk ;
37 input sys_rst_n ;
38
39 input [0:0] sys_int0_i ;
40 input [0:0] sys_int1_i ;
41 input [0:0] sys_all_t0_i ;
42 input [0:0] sys_all_t1_i ;
43 input [0:0] sys_all_rxd_i ;
44 `ifdef port_is_bidir
45 inout [7:0] sys_p0_bd ;
46 inout [7:0] sys_p1_bd ;
47 inout [7:0] sys_p2_bd ;
48 inout [7:0] sys_p3_bd ;
49 `else
50 input [7:0] sys_p0_i ; // 单向端口P0
51 input [7:0] sys_p1_i ; // 单向端口P1
52 input [7:0] sys_p2_i ; // 单向端口P2
53 input [7:0] sys_p3_i ; // 单向端口P3
54 output [7:0] sys_p0_o ; // 单向端口P0
55 output [7:0] sys_p1_o ; // 单向端口P1
56 output [7:0] sys_p2_o ; // 单向端口P2
57 output [7:0] sys_p3_o ; // 单向端口P3
58 `endif
59
60 output [0:0]sys_all_rxd_o;
61 output [0:0]sys_all_txd_o;
62 output [0:0]sys_all_rxdwr_o;
63
64
65 wire mc8051_clk;
66 wire mc8051_reset;
67
68 reg sys_rst_n_q1;
69 reg sys_rst_n_q2;
70
71 //--------------复位信号处理--------------------
72 always@(posedge sys_clk or negedge sys_rst_n) //异步复位,同步释放
73 if(!sys_rst_n)
74 sys_rst_n_q1 <= 1'b0;
75 else
76 sys_rst_n_q1 <= 1'b1;
77
78 always@(posedge sys_clk or negedge sys_rst_n)
79 if(!sys_rst_n)
80 sys_rst_n_q2 <= 1'b0;
81 else
82 sys_rst_n_q2 <= sys_rst_n_q1;
83
84 assign mc8051_reset = ~(sys_rst_n_q2); //系统低电平复位,MC8051高电平复位
85
86 //----------------并行端口sys_px作双向处理-----------------
87 `ifdef port_is_bidir
88 wire [7:0] mc8051_p0_o;
89 wire [7:0] mc8051_p1_o;
90 wire [7:0] mc8051_p2_o;
91 wire [7:0] mc8051_p3_o;
92 // 输出端口作双向端口的输出开关控制。要输出高电平,必须在双向端口加上拉电阻
93 assign sys_p0_bd = ( mc8051_p0_o == 8'b1111_1111 ) ? 8'bz: 8'b0;
94 assign sys_p1_bd = ( mc8051_p1_o == 8'b1111_1111 ) ? 8'bz: 8'b0;
95 assign sys_p2_bd = ( mc8051_p2_o == 8'b1111_1111 ) ? 8'bz: 8'b0;
96 assign sys_p3_bd = ( mc8051_p3_o == 8'b1111_1111 ) ? 8'bz: 8'b0;
97 `endif
98
99
100
101 //----------------时钟处理--------------------------
102 pll pll_inst (
103 .inclk0 ( sys_clk ), //50Mhz
104 .c0 ( mc8051_clk ) //20Mhz
105 );
106
107 //---------------MC8051内核处理----------------------
108 mc8051_top mc8051_top_inst(
109 .clk (mc8051_clk ), //18Mhz
110 .reset (mc8051_reset ), //mc8051复位,高电平有效
111
112 .int0_i (sys_int0_i ),
113 .int1_i (sys_int1_i ),
114 .all_t0_i (sys_all_t0_i ),
115 .all_t1_i (sys_all_t1_i ),
116 .all_rxd_i (sys_all_rxd_i ),
117
118 `ifdef port_is_bidir //----------------并行端口sys_px作双向处理-----------------
119 .p0_i (sys_p0_bd ), // 输入端口直接连双向端口
120 .p1_i (sys_p1_bd ), // 输入端口直接连双向端口
121 .p2_i (sys_p2_bd ), // 输入端口直接连双向端口
122 .p3_i (sys_p3_bd ), // 输入端口直接连双向端口
123
124 .p0_o (mc8051_p0_o ), // 输出端口作双向端口的输出开关控制
125 .p1_o (mc8051_p1_o ), // 输出端口作双向端口的输出开关控制
126 .p2_o (mc8051_p2_o ), // 输出端口作双向端口的输出开关控制
127 .p3_o (mc8051_p3_o ), // 输出端口作双向端口的输出开关控制
128 `else //----------------并行端口sys_px作单向处理-----------------
129 .p0_i (sys_p0_i ),
130 .p1_i (sys_p1_i ),
131 .p2_i (sys_p2_i ),
132 .p3_i (sys_p3_i ),
133
134 .p0_o (sys_p0_o ),
135 .p1_o (sys_p1_o ),
136 .p2_o (sys_p2_o ),
137 .p3_o (sys_p3_o ),
138 `endif
139 .all_rxd_o (sys_all_rxd_o ),
140 .all_txd_o (sys_all_txd_o ),
141 .all_rxdwr_o(sys_all_rxdwr_o )
142 );
143
144
145
146 endmodule



posted @ 2012-03-09 09:13  fishplj2000  阅读(736)  评论(0编辑  收藏  举报