第一篇 理論篇
第1章 處理器與MIPS 2
1.1 計算機的簡單模型 2
1.1.1 計算機的簡單組成模型 2
1.1.2 計算機的簡單使用模型 3
1.2 架構與指令集 4
1.2.1 CISC與RISC 4
1.2.2 主要的幾種ISA 5
1.3 MIPS指令集架構的演變 6
1.4 MIPS32指令集架構簡介 9
1.4.1 數據類型 9
1.4.2 寄存器 9
1.4.3 字節次序 10
1.4.4 指令格式 11
1.4.5 指令集 11
1.4.6 尋址方式 13
1.4.7 協處理器CP0 13
1.4.8 異常 14
1.5 本書的目標與組織方式 14
第2章 可編程邏輯器件與Verilog HDL 16
2.1 可編程邏輯器件概述 16
2.2 基於PLD的數字係統設計流程 18
2.2.1 設計輸入 19
2.2.2 綜閤 20
2.2.3 布局布綫 20
2.2.4 下載 20
2.2.5 仿真 20
2.2.6 工具介紹 21
2.3 Verilog HDL簡介 21
2.4 Verilog HDL中模塊的結構 22
2.5 Verilog HDL基本要素 24
2.5.1 常量 24
2.5.2 變量聲明與數據類型 24
2.5.3 嚮量 26
2.5.4 運算符 26
2.6 Verilog HDL行為語句 29
2.6.1 過程語句 29
2.6.2 賦值語句 31
2.6.3 條件語句 32
2.6.4 循環語句 34
2.6.5 編譯指示語句 35
2.6.6 行為語句的可綜閤性 37
2.7 電路設計舉例 38
2.8 仿真 41
2.8.1 係統函數 42
2.8.2 Test Bench 43
2.8.3 ModelSim仿真 45
2.9 本章小結 48
第二篇 基礎篇
第3章 教學版OpenMIPS處理器藍圖 50
3.1 係統設計目標 50
3.1.1 設計目標 50
3.1.2 五級流水綫 50
3.1.3 指令執行周期 52
3.2 教學版OpenMIPS處理器接口 53
3.3 文件說明 54
3.4 實現方法 55
第4章 第一條指令ori的實現 58
4.1 ori指令說明 58
4.2 流水綫結構的建立 59
4.2.1 流水綫的簡單模型 59
4.2.2 原始的OpenMIPS五級流水綫結構 60
4.2.3 一些宏定義 62
4.2.4 取指階段的實現 63
4.2.5 譯碼階段的實現 65
4.2.6 執行階段的實現 74
4.2.7 訪存階段的實現 78
4.2.8 迴寫階段的實現 81
4.2.9 頂層模塊OpenMIPS的實現 81
4.3 驗證OpenMIPS實現效果 85
4.3.1 指令存儲器ROM的實現 85
4.3.2 最小SOPC的實現 87
4.3.3 編寫測試程序 88
4.3.4 建立Test Bench文件 89
4.3.5 使用ModelSim檢驗OpenMIPS實現效果 90
4.4 MIPS編譯環境的建立 92
4.4.1 VisualBox的安裝與設置 93
4.4.2 GNU工具鏈的安裝 96
4.4.3 使用GNU工具進行編譯 97
4.4.4 使用GNU工具進行鏈接 99
4.4.5 得到ROM初始化文件 102
4.4.6 編寫Makefile文件 103
4.5 第一條指令實現小結 105
第5章 邏輯、移位操作與空指令的實現 107
5.1 流水綫數據相關問題 107
5.2 OpenMIPS對數據相關問題的解決措施 111
5.3 測試數據相關問題的解決效果 115
5.4 邏輯、移位操作與空指令說明 115
5.5 修改OpenMIPS以實現邏輯、移位操作與空指令 119
5.5.1 修改譯碼階段的ID模塊 120
5.5.2 修改執行階段的EX模塊 127
5.6 測試程序1——測試邏輯操作實現效果 129
5.7 測試程序2——測試移位操作與空指令實現效果 130
5.8 小結 131
第6章 移動操作指令的實現 132
6.1 移動操作指令說明 132
6.2 移動操作指令實現思路 133
6.2.1 新的數據相關情況的解決 135
6.2.2 係統結構的修改 136
6.3 修改OpenMIPS以實現移動操作指令 137
6.3.1 HI、LO寄存器的實現 137
6.3.2 修改譯碼階段的ID模塊 138
6.3.3 修改執行階段 141
6.3.4 修改訪存階段 146
6.3.5 修改迴寫階段 149
6.3.6 修改OpenMIPS頂層模塊 149
6.4 測試程序 150
第7章 算術操作指令的實現 152
7.1 簡單算術操作指令說明 153
7.2 簡單算術操作指令實現思路 156
7.3 修改OpenMIPS以實現簡單算術操作指令 157
7.3.1 修改譯碼階段的ID模塊 157
7.3.2 修改執行階段的EX模塊 164
7.4 測試簡單算術操作指令實現效果 171
7.5 流水綫暫停機製的設計與實現 174
7.5.1 流水綫暫停機製的設計 174
7.5.2 流水綫暫停機製的實現 175
7.6 乘纍加、乘纍減指令說明 180
7.7 乘纍加、乘纍減指令實現思路 181
7.8 修改OpenMIPS以實現乘纍加、乘纍減指令 182
7.8.1 修改譯碼階段的ID模塊 182
7.8.2 修改執行階段的EX模塊 184
7.8.3 修改EX/MEM模塊 189
7.8.4 修改OpenMIPS模塊 190
7.9 測試乘纍加、乘纍減指令實現效果 190
7.10 除法指令說明 191
7.11 除法指令實現思路 192
7.11.1 試商法 192
7.11.2 實現思路 193
7.11.3 係統結構的修改 193
7.12 修改OpenMIPS以實現除法指令 194
7.12.1 增加DIV模塊 194
7.12.2 修改譯碼階段的ID模塊 199
7.12.3 修改執行階段的EX模塊 200
7.12.4 修改OpenMIPS模塊 204
7.13 測試除法指令實現效果 204
7.14 數據流圖的修改 205
第8章 轉移指令的實現 206
8.1 延遲槽 206
8.2 轉移指令說明 207
8.3 轉移指令實現思路 210
8.3.1 實現思路 210
8.3.2 數據流圖的修改 210
8.3.3 係統結構的修改 211
8.4 修改OpenMIPS以實現轉移指令 212
8.4.1 修改取指階段的PC模塊 212
8.4.2 修改譯碼階段 213
8.4.3 修改執行階段的EX模塊 223
8.4.4 修改OpenMIPS模塊 225
8.5 測試轉移指令的實現效果 225
8.5.1 測試跳轉指令 225
8.5.2 測試分支指令 227
第9章 加載存儲指令的實現 230
9.1 加載存儲指令說明 230
9.1.1 加載指令lb、lbu、lh、lhu、lw說明 230
9.1.2 存儲指令sb、sh、sw說明 231
9.1.3 加載存儲指令用法示例 232
9.1.4 加載指令lwl、lwr說明 233
9.1.5 存儲指令swl、swr說明 235
9.2 加載存儲指令實現思路 238
9.2.1 數據流圖的修改 239
9.2.2 係統結構的修改 240
9.3 修改OpenMIPS以實現加載存儲指令 240
9.3.1 修改譯碼階段 240
9.3.2 修改執行階段 247
9.3.3 修改訪存階段 249
9.3.4 修改OpenMIPS頂層模塊 260
9.4 修改最小SOPC 261
9.4.1 添加數據存儲器RAM 262
9.4.2 修改最小SOPC 264
9.5 測試程序 265
9.6 鏈接加載指令ll、條件存儲指令sc說明 267
9.7 ll、sc指令實現思路 269
9.7.1 ll、sc指令實現思路 269
9.7.2 數據流圖的修改 270
9.7.3 係統結構的修改 271
9.8 修改OpenMIPS以實現ll、sc指令 271
9.8.1 LLbit寄存器的實現 271
9.8.2 修改譯碼階段的ID模塊 273
9.8.3 修改訪存階段 275
9.8.4 修改OpenMIPS模塊 279
9.9 測試ll、sc指令實現效果 279
9.10 load相關問題 281
9.10.1 load相關問題介紹 281
9.10.2 解決方法 281
9.11 修改OpenMIPS以解決load相關問題 283
9.11.1 修改譯碼階段的ID模塊 283
9.11.2 修改OpenMIPS模塊 284
9.12 測試load相關問題解決效果 285
9.13 小結 286
第10章 協處理器訪問指令的實現 287
10.1 協處理器介紹 287
10.2 協處理器CP0中的寄存器 288
10.3 協處理器CP0的實現 295
10.4 協處理器訪問指令說明 300
10.5 協處理器訪問指令實現思路 300
10.5.1 實現思路 300
10.5.2 數據流圖的修改 301
10.5.3 係統結構的修改 301
10.6 修改OpenMIPS以實現協處理器訪問指令 303
10.6.1 修改譯碼階段 303
10.6.2 修改執行階段 305
10.6.3 修改訪存階段 311
10.6.4 修改OpenMIPS模塊 314
10.7 測試程序 314
第11章 異常相關指令的實現 316
11.1 MIPS32架構中定義的異常類型 316
11.2 精確異常 318
11.3 異常處理過程 319
11.4 異常相關指令介紹 321
11.4.1 自陷指令 321
11.4.2 係統調用指令syscall 324
11.4.3 異常返迴指令eret 325
11.5 異常處理實現思路 325
11.5.1 實現思路 325
11.5.2 修改數據流圖 326
11.5.3 修改係統結構 326
11.6 修改OpenMIPS以實現異常處理 328
11.6.1 修改取指階段 328
11.6.2 修改譯碼階段 330
11.6.3 修改執行階段 339
11.6.4 修改訪存階段 346
11.6.5 修改協處理器CP0 352
11.6.6 修改控製模塊CTRL 355
11.6.7 修改OpenMIPS 357
11.7 再次修改最小SOPC 358
11.8 測試程序 359
11.8.1 測試程序1——測試係統調用異常 359
11.8.2 測試程序2——測試自陷異常 361
11.8.3 測試程序3——測試時鍾中斷 364
11.9 教學版OpenMIPS處理器實現小結 366
第三篇 進階篇
第12章 實踐版OpenMIPS處理器設計與實現 368
12.1 實踐版OpenMIPS處理器的設計目標 368
12.2 Wishbone總綫介紹 370
12.2.1 Wishbone總綫接口說明 370
12.2.2 Wishbone總綫單次讀操作的過程 372
12.2.3 Wishbone總綫單次寫操作的過程 373
12.2.4 SEL_O/SEL_I信號說明 374
12.3 實踐版OpenMIPS處理器接口 375
12.4 實踐版OpenMIPS處理器的實現思路 376
12.5 從教學版OpenMIPS到實踐版OpenMIPS 378
12.5.1 Wishbone總綫接口模塊的實現 378
12.5.2 修改CTRL模塊 384
12.5.3 修改OpenMIPS頂層模塊 386
12.6 實踐版OpenMIPS處理器實現小結 386
第13章 基於實踐版OpenMIPS的小型SOPC 387
13.1 小型SOPC的結構 387
13.2 Wishbone總綫互聯矩陣WB_CONMAX 388
13.3 GPIO 390
13.4 UART控製器 392
13.4.1 UART簡介 392
13.4.2 UART16550 IP核介紹 394
13.5 Flash控製器 398
13.5.1 Flash簡介 398
13.5.2 Flash控製器的設計 399
13.5.3 Flash控製器的實現 400
13.6 SDRAM控製器 403
13.6.1 SDRAM簡介 403
13.6.2 SDRAM CONTROLLER IP核 409
13.7 實現基於實踐版OpenMIPS的小型SOPC 412
13.8 本章小結 423
第14章 驗證實踐版OpenMIPS處理器 424
14.1 DE2平颱簡介 424
14.2 測試需要的硬件連接 425
14.3 QuartusII工程建立 426
14.4 測試步驟說明 430
14.5 測試一——GPIO實驗 431
14.5.1 測試內容 431
14.5.2 測試程序 431
14.5.3 編譯測試程序 432
14.5.4 將測試程序寫入Flash芯片 433
14.5.5 下載小型SOPC到DE2 435
14.5.6 測試效果 435
14.6 測試二——UART實驗 435
14.6.1 測試內容 435
14.6.2 測試程序 436
14.6.3 測試效果 438
14.7 測試三——模擬操作係統的加載過程 439
14.7.1 測試內容 439
14.7.2 測試程序BootLoader 439
14.7.3 測試程序SimpleOS 443
14.7.4 將測試程序寫入Flash 446
14.7.5 測試效果 448
14.8 本章小結 449
第15章 為OpenMIPS處理器移植μC/OS-II 450
15.1 為什麼需要操作係統 450
15.2 嵌入式實時操作係統介紹 451
15.3 μC/OS-II簡介 452
15.4 μC/OS-II特點 452
15.5 μC/OS-II的幾個概念 454
15.5.1 任務 454
15.5.2 任務調度 456
15.5.3 任務切換 456
15.5.4 μC/OS-II的中斷處理 457
15.5.5 時鍾節拍 457
15.5.6 μC/OS-II的初始化 458
15.5.7 μC/OS-II的啓動 458
15.6 μC/OS-II的基本功能 458
15.6.1 任務間的通信與同步 459
15.6.2 任務管理 459
15.6.3 時間管理 459
15.6.4 內存管理 460
15.7 μC/OS-II的文件體係 460
15.8 μC/OS-II的移植條件 461
15.9 C語言中使用匯編代碼 463
15.10 MIPS函數調用規範 465
15.10.1 寄存器使用規範 465
15.10.2 參數傳遞 466
15.10.3 函數返迴值 466
15.10.4 堆棧布局 467
15.10.5 示例 468
15.11 μC/OS-II在OpenMIPS處理器上的移植 470
15.11.1 文件目錄的建立 470
15.11.2 修改os_cpu.h文件 473
15.11.3 修改os_cpu_a.S文件 474
15.11.4 修改os_cpu_c.c文件 496
15.12 測試程序 500
15.12.1 創建openmips.h文件 500
15.12.2 創建openmips.c文件 502
15.13 編譯指示文件的建立 508
15.14 OpenMIPS處理器運行移植後的μC/OS-II 515
15.15 本章小結 516
附錄A 教學版OpenMIPS各個模塊的接口說明 517
A.1 PC模塊接口說明 517
A.2 IF/ID模塊接口說明 518
A.3 ID模塊接口說明 518
A.4 Regfile模塊接口說明 520
A.5 ID/EX模塊接口說明 520
A.6 EX模塊接口說明 521
A.7 DIV模塊接口說明 524
A.8 EX/MEM模塊接口說明 525
A.9 MEM模塊接口說明 527
A.10 MEM/WB模塊接口說明 529
A.11 CP0模塊接口說明 530
A.12 LLbit模塊接口說明 532
A.13 HILO模塊接口說明 532
A.14 CTRL模塊接口說明 533
附錄B OpenMIPS實現的所有指令及對應的機器碼 534
B.1 邏輯操作指令 534
B.2 移位操作指令 534
B.3 移動操作指令 535
B.4 算術操作指令 535
B.5 轉移指令 536
B.6 加載存儲指令 536
B.7 協處理器訪問指令 537
B.8 異常相關指令 537
B.9 空指令及其他指令 537
參考文獻 538
· · · · · · (
收起)