m8266_ustore_primary

// m8266_ustore_primary
// primary micro code store of pdp-11/34a
// Module is M8266
// see "1134A Field Maintenance Print Set (Jan 1977, MP00190).pdf"
// sheets K2-7 ,-8, -9, -10
//
// 12 ROMS of type NS82S137 (1024x4) are run in parallel, giving a 1024x48 ROM.
//

module  m8266_ustore_primary (
    input   wire [8:0]  mpc, // micro program counter is 9 bit
    output wire[47:0] q // raw 48 bit
    ) ;

// the micro program counter is 9 bit width.
// bit 9 is used for floating point expansion and tied to low
// bits 8 .. 0 are tied to all roms in the same permutated way:

// the micro program address, as connected to the roms
wire [9:0] rom_addr ;

assign rom_addr[9] = 0 ;      // A9 = pin 15 = constant 0
assign rom_addr[7] = mpc[8] ; // A7 = pin 17 = MPC_08_H
assign rom_addr[2] = mpc[7] ; // A2 = pin  7 = MPC_07_H
assign rom_addr[0] = mpc[6] ; // A0 = pin  5 = MPC_06_H
assign rom_addr[8] = mpc[5] ; // A8 = pin 16 = MPC_05_H
assign rom_addr[1] = mpc[4] ; // A1 = pin  6 = MPC_04_H
assign rom_addr[3] = mpc[3] ; // A3 = pin  4 = MPC_03_H
assign rom_addr[4] = mpc[2] ; // A4 = pin  3 = MPC_02_H
assign rom_addr[5] = mpc[1] ; // A5 = pin  2 = MPC_01_H
assign rom_addr[6] = mpc[0] ; // A6 = pin  1 = MPC_00_H

// rom data outputs
wire [3:0] e110_q ;
wire [3:0] e109_q ;
wire [3:0] e108_q ;
wire [3:0] e107_q ;
wire [3:0] e106_q ;
wire [3:0] e105_q ;
wire [3:0] e104_q ;
wire [3:0] e103_q ;
wire [3:0] e100_q ;
wire [3:0] e99_q ;
wire [3:0] e98_q ;
wire [3:0] e97_q ;

// mapping of rom outputs to 48 bit micro code word
// outputs of each rom are labeled
// FPMS sheet K2-7:
assign q[ 0] = e110_q[3] ; // e110, O4 = pin 11
assign q[ 1] = e110_q[2] ; // e110, O3 = pin 12
assign q[ 2] = e110_q[1] ; // e110, O2 = pin 13
assign q[ 3] = e110_q[0] ; // e110, O1 = pin 14

assign q[ 4] = e109_q[3] ; // e109, O4 = pin 11
assign q[ 5] = e109_q[2] ; // e109, O3 = pin 12
assign q[ 6] = e109_q[1] ; // e109, O2 = pin 13
assign q[ 7] = e109_q[0] ; // e109, O1 = pin 14

assign q[ 8] = e108_q[3] ; // e108, O4 = pin 11
assign q[ 9] = e108_q[2] ; // e108, O3 = pin 12
assign q[10] = e108_q[1] ; // e108, O2 = pin 13
assign q[11] = e108_q[0] ; // e108, O1 = pin 14
// FPMS sheet K2-8:
assign q[12] = e107_q[3] ; // e107, O4 = pin 11
assign q[13] = e107_q[2] ; // e107, O3 = pin 12
assign q[14] = e107_q[1] ; // e107, O2 = pin 13
assign q[15] = e107_q[0] ; // e107, O1 = pin 14

assign q[16] = e106_q[3] ; // e106, O4 = pin 11
assign q[17] = e106_q[2] ; // e106, O3 = pin 12
assign q[18] = e106_q[1] ; // e106, O2 = pin 13
assign q[19] = e106_q[0] ; // e106, O1 = pin 14

assign q[20] = e99_q[3]  ; // e99, O4 = pin 11
assign q[21] = e99_q[2]  ; // e99, O3 = pin 12
assign q[22] = e99_q[1]  ; // e99, O2 = pin 13
assign q[23] = e99_q[0]  ; // e99, O1 = pin 14

assign q[24] = e97_q[3] ;  // e97, O4 = pin 11
assign q[25] = e97_q[2] ;  // e97, O3 = pin 12
assign q[26] = e97_q[1] ;  // e97, O2 = pin 13
assign q[27] = e97_q[0] ;  // e97, O1 = pin 14
// FPMS sheet K2-9:
assign q[28] = e98_q[0] ;  // e98, O1 = pin 14
assign q[29] = e98_q[1] ;  // e98, O2 = pin 13
assign q[30] = e98_q[2] ;  // e98, O3 = pin 12
assign q[31] = e98_q[3] ;  // e98, O4 = pin 11

assign q[32] = e100_q[3] ; // e100, O4 = pin 11
assign q[33] = e100_q[2] ; // e100, O3 = pin 12
assign q[34] = e100_q[1] ; // e100, O2 = pin 13
assign q[35] = e100_q[0] ; // e100, O1 = pin 14

assign q[36] = e104_q[3] ; // e104, O4 = pin 11
assign q[37] = e104_q[2] ; // e104, O3 = pin 12
assign q[38] = e104_q[1] ; // e104, O2 = pin 13
assign q[39] = e104_q[0] ; // e104, O1 = pin 14

assign q[40] = e103_q[3] ; // e103, O4 = pin 11
assign q[41] = e103_q[2] ; // e103, O3 = pin 12
assign q[42] = e103_q[1] ; // e103, O2 = pin 13
assign q[43] = e103_q[0] ; // e103, O1 = pin 14
//FPMS sheet K2-10:
assign q[44] = e105_q[3] ; // e105, O4 = pin 11
assign q[45] = e105_q[2] ; // e105, O3 = pin 12
assign q[46] = e105_q[1] ; // e105, O2 = pin 13
assign q[47] = e105_q[0] ; // e105, O1 = pin 14


// instances of the roms
// each rom has a own definition,
// automatically generated from the binary image
m8266_e110 e110 (.a (rom_addr), .q (e110_q));
m8266_e109 e109 (.a (rom_addr), .q (e109_q));
m8266_e108 e108 (.a (rom_addr), .q (e108_q));
m8266_e107 e107 (.a (rom_addr), .q (e107_q));
m8266_e106 e106 (.a (rom_addr), .q (e106_q));
m8266_e105 e105 (.a (rom_addr), .q (e105_q));
m8266_e104 e104 (.a (rom_addr), .q (e104_q));
m8266_e103 e103 (.a (rom_addr), .q (e103_q));
m8266_e100 e100 (.a (rom_addr), .q (e100_q));
m8266_e99  e99  (.a (rom_addr), .q (e99_q));
m8266_e98  e98  (.a (rom_addr), .q (e98_q));
m8266_e97  e97  (.a (rom_addr), .q (e97_q));

endmodule