⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3_09syst

📁 大型risc处理器设计源代码,这是书中的代码 基于流水线的risc cpu设计
💻
📖 第 1 页 / 共 5 页
字号:
  always #1 if ((nRAMS1 == 1'b0) && (nSEL == 1'b0) && (TIMER_1 > 0))             s0298
              TIMER_1 = TIMER_1 - 1;                                             s0299
  always #1 if ((nRAMS2 == 1'b0) && (nSEL == 1'b0) && (TIMER_2 > 0))             s0300
              TIMER_2 = TIMER_2 - 1;                                             s0301
  always #1 if ((nRAMS3 == 1'b0) && (nSEL == 1'b0) && (TIMER_3 > 0))             s0302
              TIMER_3 = TIMER_3 - 1;                                             s0303
                                                                                 s0304
  //                                                                             s0305
  // Set access wait time of a byte                                              s0306
  // group to RAM access time                                                    s0307
  //                                                                             s0308
  always @(nRAMS0 or nSEL)                                                       s0309
    if ((nRAMS0 == 1'b0) && (nSEL == 1'b0))  TIMER_0 = `RAMTIME;                 s0310
  always @(nRAMS1 or nSEL)                                                       s0311
    if ((nRAMS1 == 1'b0) && (nSEL == 1'b0))  TIMER_1 = `RAMTIME;                 s0312
  always @(nRAMS2 or nSEL)                                                       s0313
    if ((nRAMS2 == 1'b0) && (nSEL == 1'b0))  TIMER_2 = `RAMTIME;                 s0314
  always @(nRAMS3 or nSEL)                                                       s0315
    if ((nRAMS3 == 1'b0) && (nSEL == 1'b0))  TIMER_3 = `RAMTIME;                 s0316
                                                                                 s0317
  //                                                                             s0318
  // Update state of data bus driver                                             s0319
  // (one byte group per 'always' statement)                                     s0320
  //                                                                             s0321
  always @(RAM_RnW or nRAMS0 or nSEL)                                            s0322
    if ((RAM_RnW == 1'b1) && (nRAMS0 == 1'b0) && (nSEL == 1'b0))                 s0323
         DATA_DRV[ 7: 0] = 8'bxxxxxxxx;                                          s0324
    else DATA_DRV[ 7: 0] = 8'bzzzzzzzz;                                          s0325
  always @(RAM_RnW or nRAMS1 or nSEL)                                            s0326
    if ((RAM_RnW == 1'b1) && (nRAMS1 == 1'b0) && (nSEL == 1'b0))                 s0327
         DATA_DRV[15: 8] = 8'bxxxxxxxx;                                          s0328
    else DATA_DRV[15: 8] = 8'bzzzzzzzz;                                          s0329
  always @(RAM_RnW or nRAMS2 or nSEL)                                            s0330
    if ((RAM_RnW == 1'b1) && (nRAMS2 == 1'b0) && (nSEL == 1'b0))                 s0331
         DATA_DRV[23:16] = 8'bxxxxxxxx;                                          s0332
    else DATA_DRV[23:16] = 8'bzzzzzzzz;                                          s0333
  always @(RAM_RnW or nRAMS3 or nSEL)                                            s0334
    if ((RAM_RnW == 1'b1) && (nRAMS3 == 1'b0) && (nSEL == 1'b0))                 s0335
         DATA_DRV[31:24] = 8'bxxxxxxxx;                                          s0336
    else DATA_DRV[31:24] = 8'bzzzzzzzz;                                          s0337
                                                                                 s0338
  //                                                                             s0339
  // When access address or access mode change, set access                       s0340
  // wait time of all byte groups to memory access time                          s0341
  //                                                                             s0342
  always @(RAM_ADDR or RAM_RnW) begin                                            s0343
    TIMER_0 = `RAMTIME;                                                          s0344
    TIMER_1 = `RAMTIME;                                                          s0345
    TIMER_2 = `RAMTIME;                                                          s0346
    TIMER_3 = `RAMTIME;                                                          s0347
  end                                                                            s0348
                                                                                 s0349
endmodule // ram                                                                 s0350
                                                                                 s0351
                                                                                 s0352
//----------------------------------------------------------------------------   s0353
//                                                                               s0354
// ROM                                                                           s0355
//                                                                               s0356
// 4K 32-bit read-only memory with definable access time                         s0357
//                                                                               s0358
//----------------------------------------------------------------------------   s0359
                                                                                 s0360
module rom (ROM_DATA, ROM_ADDR, nROM_SEL);                                       s0361
                                                                                 s0362
  parameter     WC =           11;   // word count = number of address lines     s0363
                                     // default 11 => 2^11 = 2K = 8KB            s0364
                                                                                 s0365
  output [31:0] ROM_DATA;            // ROM data                                 s0366
                                                                                 s0367
  input  [27:0] ROM_ADDR;            // ROM address                              s0368
  input         nROM_SEL;            // ROM selection                            s0369
                                                                                 s0370
  reg    [31:0] DATA_DRV;            // data driver                              s0371
                                                                                 s0372
  wire   [31:0] ROM_DATA = DATA_DRV; // data bus                                 s0373
  wire   [27:0] ROM_ADDR;            // address bus                              s0374
  wire          nROM_SEL;            // ROM selection                            s0375
                                                                                 s0376
  reg    [31:0] MEMORY[0:(1<<WC)-1]; // memory                                   s0377
  integer       TIMER;               // access time counter                      s0378
                                                                                 s0379
  //                                                                             s0380
  // Load operating system                                                       s0381
  //                                                                             s0382
  initial begin                                                                  s0383
    //                                                                           s0384
    // ROM size between                                                          s0385
    // 1KB and 64MB                                                              s0386
    //                                                                           s0387
    if (( WC < 8 ) || ( WC > 24) ) begin                                         s0388
       $display("FATAL ERROR:\n%m: wrong ROM size\n");                           s0389
       $finish(2);                                                               s0390
    end                                                                          s0391
    //                                                                           s0392
    // Load program                                                              s0393
    //                                                                           s0394
    if (`OS_FORMAT) $readmemh(`OS_ROM, MEMORY);                                  s0395
    else            $readmemb(`OS_ROM, MEMORY);                                  s0396
  end                                                                            s0397
                                                                                 s0398
                                                                                 s0399
  //                                                                             s0400
  // After end of access wait time,                                              s0401
  // put data on data bus;                                                       s0402
  // if address outside ROM, stop system                                         s0403
  //                                                                             s0404
  always @(TIMER) begin                                                          s0405
    if ((nROM_SEL == 1'b0) && (TIMER == 0)) begin                                s0406
      if ((`CHK_HGH_BITs == 1) && (ROM_ADDR[27:WC+1] != 0))                      s0407
      begin                                                                      s0408
        $display(                                                                s0409
          "\nERROR: Addr invalid; Addr = --%b--\n", ROM_ADDR                     s0410
        );                                                                       s0411
        $stop(2);                                                                s0412
      end                                                                        s0413
      DATA_DRV = MEMORY[ROM_ADDR[WC-1:0]];                                       s0414
    end                                                                          s0415
  end                                                                            s0416
                                                                                 s0417
  //                                                                             s0418
  // Count down access wait time                                                 s0419
  // synchronously with simulation time                                          s0420
  //                                                                             s0421
  always #1 if ((nROM_SEL == 1'b0) && (TIMER > 0)) TIMER = TIMER - 1;            s0422
                                                                                 s0423
  //                                                                             s0424
  // When memory activation changes, update remaining                            s0425
  // access wait time and state of data bus driver                               s0426
  //                                                                             s0427
  always @(nROM_SEL) begin                                                       s0428
    if (nROM_SEL == 1'b0) begin                                                  s0429
      TIMER = `ROMTIME;                                                          s0430
      DATA_DRV = {32{1'bx}};                                                     s0431
    end                                                                          s0432
    else DATA_DRV = {32{1'bz}};                                                  s0433
  end                                                                            s0434
                                                                                 s0435
  //                                                                             s0436
  // If change of address, set access                                            s0437
  // wait time to memory access time                                             s0438
  //                                                                             s0439
  always @(ROM_ADDR)  TIMER = `ROMTIME;                                          s0440
                                                                                 s0441
endmodule // rom                                                                 s0442
                                                                                 s0443
                                                                                 s0444
//----------------------------------------------------------------------------   s0445
//                                                                               s0446

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -