OpenCores
URL https://opencores.org/ocsvn/mc6803/mc6803/trunk

Subversion Repositories mc6803

[/] [mc6803/] [trunk/] [MC6803_gen2.sv] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 Dukov
module MC6803_gen2(
2
                input logic clk,
3
                RST,
4
                hold,
5
                halt,
6
                irq,
7
                nmi,
8
                input logic[7:0] PORT_A_IN,
9
                input logic[4:0] PORT_B_IN,
10
                input logic[7:0] DATA_IN,
11
                output logic[7:0] PORT_A_OUT,
12
                output logic[4:0] PORT_B_OUT,
13
                output logic[15:0] ADDRESS,
14
                output logic[7:0] DATA_OUT,
15
                output logic E_CLK, rw);
16
 
17
logic[7:0] DATA_IN_s, PORT_A_IN_s;
18
logic[4:0] PORT_B_IN_s;
19
logic[7:0] data_in;
20
logic hold_s, halt_s, irq_s, nmi_s;
21
 
22
logic DDR1_E, DDR2_E, P1_E, P2_E, TCS_E, CH_E, CL_E, OCRH_E, OCRL_E, iRAM_E;
23
logic OCF, next_OCF, TOF, next_TOF, EICI, next_EICI, EOCI, next_EOCI, ETOI, next_ETOI, IEDG, next_IEDG, OLVL, next_OLVL;
24
logic irq_tof, irq_ocf;
25
logic[7:0] next_port_a, next_DDR1, DDR1;
26
logic[4:0] next_port_b, next_DDR2, DDR2;
27
logic[15:0] counter, next_counter;
28
logic[7:0] OCRH, OCRL, next_OCRH, next_OCRL;
29
logic REG_RW;
30
logic[7:0] REG_DATA;
31
logic TOF_reset, OCF_reset;
32
 
33
cpu01 cpu01_inst(.clk(clk), .rst(RST), .rw(rw), .vma(E_CLK), .address(ADDRESS), .data_in(data_in), .data_out(DATA_OUT), .hold(hold_s), .halt(halt_s), .irq(irq_s), .nmi(nmi_s), .irq_icf(1'b0), .irq_ocf(irq_ocf), .irq_tof(irq_tof), .irq_sci(1'b0));
34
 
35
MEM_128_8 iMEM(.Clk(clk), .reset(RST), .data_in(DATA_OUT), .data_out(REG_DATA), .RW(REG_RW), .address(ADDRESS[6:0]));
36
 
37
always_ff @(negedge clk)
38
begin
39
        if(RST)
40
        begin
41
                counter <= 0;
42
                OCF <= 0;
43
                EICI <= 0;
44
                EOCI <= 0;
45
                ETOI <= 0;
46
                IEDG <= 0;
47
                OLVL <= 0;
48
                OCRH <= 0;
49
                OCRL <= 0;
50
        end
51
        else
52
        begin
53
                DATA_IN_s <= DATA_IN;
54
                PORT_A_IN_s <= PORT_A_IN;
55
                PORT_B_IN_s <= PORT_B_IN;
56
                hold_s <= hold;
57
                halt_s <= halt;
58
                irq_s <= irq;
59
                nmi_s <= nmi;
60
                EICI <= next_EICI;
61
                EOCI <= next_EOCI;
62
                ETOI <= next_ETOI;
63
                IEDG <= next_IEDG;
64
                OLVL <= next_OLVL;
65
                PORT_A_OUT <= next_port_a;
66
                PORT_B_OUT <= next_port_b;
67
                counter <= next_counter;
68
                OCRH <= next_OCRH;
69
                OCRL <= next_OCRL;
70
                DDR1 <= next_DDR1;
71
                DDR2 <= next_DDR2;
72
//timer resets
73
        end
74
        if(TCS_E & rw & TOF)
75
                TOF_reset <= 1'b1;
76
        if(TOF_reset & rw & CH_E)
77
        begin
78
                TOF <= 1'b0;
79
                TOF_reset <= 1'b0;
80
        end
81
        else
82
                TOF <= next_TOF;
83
        if(TCS_E & rw & OCF)
84
                OCF_reset <= 1'b1;
85
        if(OCF_reset & (~rw) & (OCRH_E | OCRL_E))
86
        begin
87
                OCF <= 1'b0;
88
                OCF_reset <= 1'b0;
89
        end
90
        else
91
                OCF <= next_OCF;
92
end
93
 
94
always_comb
95
begin
96
        if(ADDRESS > 16'h7f && ADDRESS < 16'h100 && E_CLK)
97
                iRAM_E = 1'b1;
98
        else
99
                iRAM_E = 0;
100
        DDR1_E = 1'b0;
101
        DDR2_E = 1'b0;
102
        P1_E = 1'b0;
103
        P2_E = 1'b0;
104
        TCS_E = 1'b0;
105
        CH_E = 1'b0;
106
        CL_E = 1'b0;
107
        OCRH_E = 1'b0;
108
        OCRL_E = 1'b0;
109
        //ICRH_E = 1'b0;
110
        //ICRL_E = 1'b0;
111
        data_in = DATA_IN_s;
112
        next_port_a = PORT_A_OUT;
113
        next_port_b = PORT_B_OUT;
114
        next_DDR1 = DDR1;
115
        next_DDR2 = DDR2;
116
        irq_tof = 1'b0;
117
        irq_ocf = 1'b0;
118
        next_EICI = EICI;
119
        next_OCRH = OCRH;
120
        next_OCRL = OCRL;
121
        next_EOCI = EOCI;
122
        next_ETOI = ETOI;
123
        next_IEDG = IEDG;
124
        next_OLVL = OLVL;
125
        REG_RW = 1'b1;
126
 
127
        case (ADDRESS)
128
                16'h00: DDR1_E = 1'b1;
129
                16'h01: DDR2_E = 1'b1;
130
                16'h02: P1_E = 1'b1;
131
                16'h03: P2_E = 1'b1;
132
                16'h08: TCS_E = 1'b1;
133
                16'h09: CH_E = 1'b1;
134
                16'h0A: CL_E = 1'b1;
135
                16'h0B: OCRH_E = 1'b1;
136
                16'h0C: OCRL_E = 1'b1;
137
//              16'h0D: ICRH_E = 1'b1;
138
//              16'h0E: ICRL_E = 1'b1;
139
                default: ;
140
        endcase
141
 
142
// port A
143
        if(P1_E)
144
        begin
145
                data_in = (PORT_A_IN_s & (~DDR1))|(PORT_A_OUT & (DDR1));
146
                if(E_CLK & (~rw))
147
                        next_port_a = DATA_OUT;
148
                else
149
                        next_port_a = PORT_A_OUT;
150
        end
151
        if(DDR1_E)
152
        begin
153
                data_in = DDR1;
154
                if(E_CLK & (~rw))
155
                        next_DDR1 = DATA_OUT;
156
                else
157
                        next_DDR1 = DDR1;
158
        end
159
//port B
160
        if(P2_E)
161
        begin
162
                data_in = (PORT_B_IN_s & (~DDR2))|(PORT_B_OUT & (DDR2));
163
                if(E_CLK & (~rw))
164
                        next_port_b = DATA_OUT[4:0];
165
                else
166
                        next_port_b = PORT_B_OUT;
167
        end
168
        if(DDR2_E)
169
        begin
170
                data_in = DDR2;
171
                if(E_CLK & (~rw))
172
                        next_DDR2 = DATA_OUT[4:0];
173
                else
174
                        next_DDR2 = DDR2;
175
        end
176
// programmable timer
177
//counter
178
        next_counter = counter + 16'h01;
179
        if(CH_E & E_CLK & (~rw))
180
                next_counter = 16'hFFF8;
181
        if(counter == 16'hFFFF)
182
        begin
183
                next_TOF = 1'b1;
184
                irq_tof = ETOI;
185
        end
186
        else
187
                next_TOF = TOF;
188
        if(CH_E)
189
                data_in = counter[15:8];
190
        if(CL_E)
191
                data_in = counter[7:0];
192
// output compare
193
        if(OCRH_E)
194
        begin
195
                data_in = OCRH;
196
                if(E_CLK & (~rw))
197
                        next_OCRH = DATA_OUT;
198
                else
199
                        next_OCRH = OCRH;
200
        end
201
        if(OCRL_E)
202
        begin
203
                data_in = OCRL;
204
                if(E_CLK & (~rw))
205
                        next_OCRL = DATA_OUT;
206
                else
207
                        next_OCRL = OCRL;
208
        end
209
        if(next_counter == {OCRH, OCRL})
210
        begin
211
                next_OCF = 1'b1;
212
                irq_ocf = EOCI;
213
        end
214
        else
215
                next_OCF = OCF;
216
// control and status
217
        if(TCS_E)
218
        begin
219
                data_in = {1'b0, OCF, TOF, EICI, EOCI, ETOI, IEDG, OLVL};
220
                if(E_CLK & (~rw))
221
                begin
222
                        next_EICI = DATA_OUT[4];
223
                        next_EOCI = DATA_OUT[3];
224
                        next_ETOI = DATA_OUT[2];
225
                        next_IEDG = DATA_OUT[1];
226
                        next_OLVL = DATA_OUT[0];
227
                end
228
                else
229
                begin
230
                        next_EICI = EICI;
231
                        next_EOCI = EOCI;
232
                        next_ETOI = ETOI;
233
                        next_IEDG = IEDG;
234
                        next_OLVL = OLVL;
235
                end
236
        end
237
//internal memory
238
        if(iRAM_E)
239
        begin
240
                data_in = REG_DATA;
241
                REG_RW = rw;
242
        end
243
end
244
 
245
endmodule
246
 
247
module MEM_128_8(input logic[6:0] address, input logic RW, Clk, reset, input logic[7:0] data_in, output logic[7:0] data_out);
248
logic[7:0] REGS[127:0];
249
integer i;
250
always_ff @ (posedge Clk)
251
begin
252
if(reset)
253
        for(i=0; i<128; i=i+1)
254
                REGS[i]=0;
255
else if(~RW)
256
        REGS[address] <= data_in;
257
end
258
assign data_out = REGS[address];
259
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.