Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
6502 [2018/11/27 09:36]
org
6502 [2020/02/10 13:08] (текущий)
org
Строка 149: Строка 149:
   * RES: аппаратный сброс. После включения 6502 нужно устанавливать контакт /RES в 0 в течении нескольких тактов,​ чтобы процессор "​пришёл в себя"​.   * RES: аппаратный сброс. После включения 6502 нужно устанавливать контакт /RES в 0 в течении нескольких тактов,​ чтобы процессор "​пришёл в себя"​.
   * BRK: программное прерывание. Инициируется инструкцией [[6502:​brk-00|BRK]].   * BRK: программное прерывание. Инициируется инструкцией [[6502:​brk-00|BRK]].
- 
-## Verilog 
- 
-<code verilog> 
-// ------------------ 
-// Dispatcher 
- 
-module Dispatcher ( 
-    // Outputs 
-    _ready, _IPC, _T0X, _T1X, T0, T1, _T2, _T3, _T4, _T5, T5, T6, RD, Z_IR, FETCH, RW, SYNC, ACRL2, ​ 
-    // Inputs 
-    PHI0, RDY, 
-    DORES, RESP, B_OUT, BRK6E, BRFW, _BRTAKEN, ACR, _ADL_PCL, PC_DB, _IMPLIED, _TWOCYCLE, ​ 
-    decoder 
-); 
- 
-    input PHI0, RDY; 
-    input DORES, RESP, B_OUT, BRK6E, BRFW, _BRTAKEN, ACR, _ADL_PCL, PC_DB, _IMPLIED, _TWOCYCLE; 
-    input [129:0] decoder; 
- 
-    output _ready, _IPC, _T0X, _T1X, T0, T1, _T2, _T3, _T4, _T5, T5, T6, RD, Z_IR, FETCH, RW, SYNC, ACRL2; 
-    wire _ready, _IPC, _T0X, _T1X, T0, T1, _T2, _T3, _T4, _T5, T5, T6, RD, Z_IR, FETCH, RW, SYNC; 
- 
-    // Clocks 
-    wire PHI1, PHI2; 
-    assign PHI1 = ~PHI0; 
-    assign PHI2 = PHI0; 
- 
-    // Misc 
-    wire BR2, BR3, _MemOP, STOR, _SHIFT, _STORE; 
-    assign BR2 = decoder[80];​ 
-    assign BR3 = decoder[93];​ 
-    assign _MemOP = ~( decoder[111] | decoder[122] | decoder[123] | decoder[124] | decoder[125] ); 
-    assign STOR = ~( ~decoder[97] | _MemOP ); 
-    assign _SHIFT = ~( decoder[106] | decoder[107] ); 
-    assign _STORE = ~decoder[97];​ 
- 
-    // Ready Control 
-    wire Ready1_Out, Ready2_Out; 
-    mylatch Ready1 ( Ready1_Out, ~(RDY | Ready2_Out),​ PHI2 ); 
-    mylatch Ready2 ( Ready2_Out, WR, PHI1 ); 
-    assign _ready = Ready1_Out; 
- 
-    // R/W Control 
-    wire WRLatch_Out,​ RWLatch_Out;​ 
-    wire WR; 
-    mylatch WRLatch ( WRLatch_Out,​ ~( decoder[98] | decoder[100] | T5 | STOR | T6 | PC_DB), PHI2 ); 
-    assign WR = ~ ( _ready | REST | WRLatch_Out ); 
-    mylatch RWLatch ( RWLatch_Out,​ WR, PHI1 ); 
-    assign RW = ~RWLatch_Out;​ 
-    assign RD = (PHI1 | ~RWLatch_Out);​ 
- 
-    // Short Cycle Counter (T0-T1) 
-    wire TRESXLatch_Out,​ TWOCYCLELatch_Out,​ TRES1Latch_Out,​ T0Latch_Out,​ T1Latch_Out;​ 
-    mylatch TRESXLatch ( TRESXLatch_Out,​ TRESX, PHI1 ); 
-    mylatch TWOCYCLELatch ( TWOCYCLELatch_Out,​ _TWOCYCLE, PHI1 ); 
-    mylatch TRES1Latch ( TRES1Latch_Out,​ TRES1, PHI1 ); 
-    assign _T0X = ~( (~(TRESXLatch_Out&​TWOCYCLELatch_Out) & ~TRES1Latch_Out) | ~(T0Latch_Out | T1Latch_Out) ); 
-    assign T0 = ~_T0X; 
-    mylatch T0Latch ( T0Latch_Out,​ _T0X, PHI2 ); 
-    mylatch T1Latch ( T1Latch_Out,​ ~(T0Latch_Out | _ready), PHI1 ); 
-    assign _T1X = ~T1Latch_Out;​ 
- 
-    // Long Cycle Counter (T2-T5) (Shift Register) 
-    wire T1InputLatch_Out;​ 
-    mylatch T1InputLatch ( T1InputLatch_Out,​ T1, PHI2 ); 
- 
-    wire LatchIn_T2_Out,​ LatchOut_T2_Out;​ 
-    mylatch LatchIn_T2 ( LatchIn_T2_Out,​ _ready ? LatchOut_T2_Out : ~T1InputLatch_Out,​ PHI1 ); 
-    mylatch LatchOut_T2 ( LatchOut_T2_Out,​ ~(LatchIn_T2_Out | TRES2), PHI2 ); 
-    assign _T2 = (LatchIn_T2_Out | TRES2 ); 
- 
-    wire LatchIn_T3_Out,​ LatchOut_T3_Out;​ 
-    mylatch LatchIn_T3 ( LatchIn_T3_Out,​ _ready ? LatchOut_T3_Out : ~LatchOut_T2_Out,​ PHI1 ); 
-    mylatch LatchOut_T3 ( LatchOut_T3_Out,​ ~(LatchIn_T3_Out | TRES2), PHI2 ); 
-    assign _T3 = (LatchIn_T3_Out | TRES2 ); 
- 
-    wire LatchIn_T4_Out,​ LatchOut_T4_Out;​ 
-    mylatch LatchIn_T4 ( LatchIn_T4_Out,​ _ready ? LatchOut_T4_Out : ~LatchOut_T3_Out,​ PHI1 ); 
-    mylatch LatchOut_T4 ( LatchOut_T4_Out,​ ~(LatchIn_T4_Out | TRES2), PHI2 ); 
-    assign _T4 = (LatchIn_T4_Out | TRES2 ); 
- 
-    wire LatchIn_T5_Out,​ LatchOut_T5_Out;​ 
-    mylatch LatchIn_T5 ( LatchIn_T5_Out,​ _ready ? LatchOut_T5_Out : ~LatchOut_T4_Out,​ PHI1 ); 
-    mylatch LatchOut_T5 ( LatchOut_T5_Out,​ ~(LatchIn_T5_Out | TRES2), PHI2 ); 
-    assign _T5 = (LatchIn_T5_Out | TRES2 ); 
- 
-    // Extra Cycle Counter (T5-T6) 
-    wire T56Latch_Out,​ T5Latch1_Out,​ T2Latch2_Out,​ T6Latch1_Out,​ T6Latch2_Out;​ 
-    mylatch T56Latch ( T56Latch_Out,​ ~(_SHIFT | _MemOP | _ready), PHI2 ); 
-    mylatch T5Latch1 ( T5Latch1_Out,​ ~(T5Latch2_Out & _ready) & ~T56Latch_Out,​ PHI1 ); 
-    mylatch T5Latch2 ( T5Latch2_Out,​ ~T5Latch1_Out,​ PHI2 ); 
-    mylatch T6Latch1 ( T6Latch1_Out,​ ~(~T5Latch1_Out & ~_ready), PHI2 ); 
-    mylatch T6Latch2 ( T6Latch2_Out,​ ~T5Latch1_Out,​ PHI1 ); 
-    assign T5 = ~T5Latch1_Out;​ 
-    assign T6 = T6Latch2_Out;​ 
- 
-    // Instruction Termination (reset cycle counters) 
-    wire REST, ENDS, ENDX, TRES2; 
-    wire ENDS1_Out, ENDS2_Out; 
-    assign REST = ~(_STORE & _SHIFT) & DORES; 
- 
-    mylatch ENDS1 ( ENDS1_Out, _ready ? ~T1 : (~(_BRTAKEN & BR2) & ~T0), PHI2 ); 
-    mylatch ENDS2 ( ENDS2_Out, RESP, PHI2 ); 
-    assign ENDS = ~( ENDS1_Out | ENDS2_Out ); 
- 
-    wire temp; 
-    assign temp = ~( decoder[100] | decoder[101] | decoder[102] | decoder[103] | decoder[104] | decoder[105]);​ 
-    assign ENDX = ~( ~temp | T6 | BR3 | ~(_MemOP | decoder[96] | ~_SHIFT) ); 
- 
-    wire ReadyPhi1_Out,​ RESP1_Out, RESP2_Out, T1L_Out; 
-    mylatch ReadyPhi1 ( ReadyPhi1_Out,​ ~_ready, PHI1 ); 
-    mylatch RESP1 ( RESP1_Out, ~(RESP | ReadyPhi1_Out | RESP2_Out), PHI2 ); 
-    mylatch RESP2 ( RESP2_Out, ~(RESP1_Out | Brfw), PHI1 ); 
-    mylatch T1L ( T1L_Out, ~TRES1, PHI1 ); 
-    assign T1 = ~T1L_Out; 
-    assign TRES1 = (ENDS | ~(_ready | ~(RESP1_Out | Brfw) ) ); 
-    assign SYNC = T1; 
- 
-    wire TRESX1_Out, TRESX2_Out; 
-    mylatch TRESX1 ( TRESX1_Out, ~(decoder[91] | decoder[92]),​ PHI2); 
-    mylatch TRESX2 ( TRESX2_Out, ~( RESP | ENDS | ~(_ready | ENDX) ), PHI2 ); 
-    assign TRESX = ~(BRK6E | ~(_ready | ACRL1 | REST | TRESX1_Out) | ~TRESX2_Out);​ 
- 
-    wire TRES2Latch_Out;​ 
-    mylatch TRES2Latch ( TRES2Latch_Out,​ TRESX, PHI1 ); 
-    assign TRES2 = ~TRES2Latch_Out;​ 
- 
-    // ACR Latch 
-    wire ACRL1, ACRL2; 
-    wire ACRL1Latch_Out,​ ACRL2Latch_Out;​ 
-    assign ACRL2 = ~(~ACR & ~ReadyDelay) & (~ReadyDelay | ~ACRL1Latch_Out);​ 
-    mylatch ACRL1Latch ( ACRL1Latch_Out,​ ~ACRL2Latch_Out,​ PHI2 ); 
-    mylatch ACRL2Latch ( ACRL2Latch_Out,​ ACRL2, PHI1 ); 
-    assign ACRL1 = ~ACRL1Latch_Out;​ 
- 
-    // Program Counter Increment Control 
-    wire ReadyDelay, Brfw; 
- 
-    wire DelayLatch1_Out,​ DelayLatch2_Out;​ 
-    mylatch DelayLatch1 ( DelayLatch1_Out,​ _ready, PHI1 ); 
-    mylatch DelayLatch2 ( DelayLatch2_Out,​ ~DelayLatch1_Out,​ PHI2 ); 
-    assign ReadyDelay = ~DelayLatch2_Out;​ 
- 
-    wire BRFWLatch_Out;​ 
-    mylatch BRFWLatch ( BRFWLatch_Out,​ ~(~BR3 | ReadyDelay),​ PHI2 ); 
-    assign Brfw = ~(BRFW ^ ACR) & BRFWLatch_Out;​ 
- 
-    wire RouteCLatch_Out,​ a_out, b_out, c_out; 
-    mylatch RouteCLatch ( RouteCLatch_Out,​ ~(BR2 & _BRTAKEN) & (_ADL_PCL | BR2 | BR3), PHI2 ); 
-    mylatch c_latch ( c_out, ~(RouteCLatch_Out | _ready | ~_IMPLIED), PHI1 ); 
-    mylatch a_latch ( a_out, B_OUT, PHI1 ); 
-    mylatch b_latch ( b_out, Brfw, PHI1 ); 
-    assign _IPC = ~(a_out & (b_out | c_out)); 
- 
-    // Fetch Control 
-    wire FetchLatch_Out;​ 
-    mylatch FetchLatch ( FetchLatch_Out,​ T1, PHI2 ); 
-    assign FETCH = ~( _ready | ~FetchLatch_Out ); 
-    assign Z_IR = ~( B_OUT & FETCH ); 
- 
-endmodule ​  // Dispatcher 
-</​code>​ 
  
 {{template>​6502:​6502_blocks}} {{template>​6502:​6502_blocks}}
  • Показать страницу