Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
6502:predecode [2013/10/18 22:44]
org
6502:predecode [2015/09/03 23:12] (текущий)
org
Строка 42: Строка 42:
 </​code>​ </​code>​
  
 +==== Verilog ====
 +
 +<code verilog>
 +// ------------------
 +// Predecode
 +
 +// Controls:
 +// 0/IR : "​Inject"​ BRK opcode after interrupt (force IR = 0x00), to initiate common "​BRK-sequence"​ service
 +// #IMPLIED : NOT Implied instruction (has operands)
 +// #TWOCYCLE : NOT short two-cycle instruction (more than 2 cycles)
 +
 +module Predecode (
 +    // Outputs
 +    PD, _IMPLIED, _TWOCYCLE,
 +    // Inputs
 +    PHI0, Z_IR,
 +    // Buses
 +    DATA
 +);
 +
 +    input PHI0, Z_IR;
 +
 +    output [7:0] PD;
 +    output _IMPLIED, _TWOCYCLE;
 +
 +    inout [7:0] DATA;
 +
 +    wire [7:0] DATA;
 +
 +    reg [7:0] PD = 8'​b00000000; ​    // Power-up state
 +
 +    // Clocks
 +    wire PHI1, PHI2;
 +    assign PHI1 = ~PHI0;
 +    assign PHI2 = PHI0;
 +
 +    wire temp1, temp2;
 +    wire [7:0] pdout;
 +    assign pdout = Z_IR ? 8'​b00000000 : PD;
 +
 +    assign _IMPLIED = (pdout[0] | pdout[2] | ~pdout[3]);
 +
 +    assign temp1 = ~(~pdout[0] | pdout[2] | ~pdout[3] | pdout[4]);
 +    assign temp2 = ~(pdout[0] | pdout[2] | pdout[3] | pdout[4] | ~pdout[7]); ​
 +    assign _TWOCYCLE = (~(temp1 | temp2) & ~(~_IMPLIED & (pdout[1] | pdout[4] | pdout[7])));​
 +
 +initial begin
 +    PD = 8'​b00000000; ​      // For safety
 +end
 +
 +always @(PHI2) begin        // D-latch array on real 6502
 +    PD <= DATA;
 +end
 +
 +endmodule ​  // Predecode
 +</​code>​
 {{template>​6502_blocks}} {{template>​6502_blocks}}
  • Показать страницу