// 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