├── .gitmessage ├── README.md ├── commit_message.md ├── img ├── lab1 │ ├── p1.png │ ├── p10.png │ ├── p11.png │ ├── p12.png │ ├── p13.png │ ├── p14.png │ ├── p15.png │ ├── p16.png │ ├── p17.png │ ├── p18.png │ ├── p19.png │ ├── p2.png │ ├── p20.png │ ├── p21.png │ ├── p22.png │ ├── p23.png │ ├── p24.png │ ├── p25.png │ ├── p26.jpg │ ├── p27.jpg │ ├── p28.png │ ├── p3.png │ ├── p4.png │ ├── p5.png │ ├── p6.png │ ├── p7.png │ ├── p8.png │ └── p9.png ├── lab3 │ ├── 2020-09-09-lab3-vivado-add-directory.png │ ├── 2020-09-09-lab3-vivado-verify-design-source.png │ ├── 2020-09-09-vivado-load-coe.png │ ├── interface-example-wavedrom.svg │ ├── p1.png │ └── p2.png ├── lab5 │ ├── 2020-09-18-hardware-connected.png │ ├── 2020-09-18-hardware-run.png │ ├── 2020-09-18-verify-vivado-hdl-source.png │ ├── 2020-09-18-vivado-simulation-pad.png │ ├── 2020-09-22-seg-map-zh.png │ ├── 2020-09-22-seg-map.png │ ├── 2020-09-22-trace-error.png │ ├── 2020-09-22-trace-running.png │ ├── 2020-09-22-trace-success.png │ ├── read_data.svg │ ├── read_inst.svg │ ├── wavedrom-svgcontent.svg │ └── write_data.svg ├── lab7 │ ├── p1.png │ ├── p2.png │ ├── p3.png │ ├── p4.png │ ├── p5.png │ ├── p6.png │ └── p7.png └── others │ ├── p1.jpg │ ├── p10.png │ ├── p11.png │ ├── p12.png │ ├── p13.png │ ├── p14.png │ ├── p15.png │ ├── p16.png │ ├── p17.png │ ├── p18.png │ ├── p19.png │ ├── p2.jpg │ ├── p20.png │ ├── p21.png │ ├── p22.png │ ├── p23.png │ ├── p24.png │ ├── p25.png │ ├── p27.png │ ├── p28.png │ ├── p29.png │ ├── p3.png │ ├── p30.png │ ├── p31.png │ ├── p32.png │ ├── p4.png │ ├── p5.png │ ├── p6.png │ ├── p7.png │ ├── p8.png │ └── p9.png ├── lab1 ├── introduction.md ├── led.md └── num_led.md ├── lab3 ├── example-wavedrom.json ├── introduction.md ├── single_cycle.drawio └── singlecycle.md ├── lab5 ├── introduction.md └── soc-interface.md ├── lab7 ├── cache.md └── introduction.md └── others ├── cross_compiler.md ├── install.md ├── ip.md └── vivado_skill.md /.gitmessage: -------------------------------------------------------------------------------- 1 | # (): 2 | 3 | # - type: add, mod, del 4 | # - file: the file have changed 5 | # - msg: more info 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BIT MIPS EXPERIMENTS DOC 2 | 3 | > 本仓库文档是为北理工 MIPS 相关实验提供的实验参考手册 4 | 5 | ## 简介 6 | 7 | 为更好的方便北理工同学完成 MIPS 相关系列实验,特别提供本参考手册,通过本参考手册可以较好的完成相关实验。 8 | 9 | 具体实验代码仓库如下:[https://github.com/bit-mips/bitmips_experiments](https://github.com/bit-mips/bitmips_experiments)。请将实验代码克隆至本地 10 | 11 | ``` 12 | git clone git@github.com:bit-mips/bitmips_experiments.git 13 | ``` 14 | 15 | MIPS 相关系列实验主要是针对**计算机系统能力培养**而制定的一系列相关实验,通过完成这些实验,逐步"进阶",最终可以完成一个较完备的 MIPS CPU 的设计,并且可以参加[龙芯杯](http://www.nscscc.org/)比赛。同时,本文档及相关实验也适用于本校的`计算机组成原理课程设计`等课程,如有兴趣可以参考。 16 | 17 | 该系列实验的完成是一个循序渐进的过程,难度和深度逐渐增加,同时也会有相应的硬件部分和软件部分。 18 | 19 | ## 实验介绍及目录 20 | 21 | - 实验一:跑马灯 & 数码管 22 | - 该实验主要目的是让读者对 Verilog 语言以及对 Vivado 工具的使用进行简单回顾,相对来说比较简单,读者需要完成一个跑马灯的设计和一个数码管显示的设计,能够通过仿真并且能够下板运行。如果对 Verilog 语言掌握的比较好了可以跳过此环节。 23 | - 先修理论课程:数字逻辑 24 | - [实验介绍](./lab1/introduction.md) 25 | - [跑马灯实验指导](./lab1/led.md) 26 | - [数码管实验指导](./lab1/num_led.md) 27 | 28 | - 实验二:计算机组成原理系列小实验 29 | - 2.1 汉明校验码 30 | - 2.2 指令译码(MIPS 架构指令举例) 31 | - 2.3 并行加法器 32 | - 2.4 Booth 乘法 33 | - 2.5 加减交替除法 34 | - 先修理论课程:计算机组成原理 35 | 36 | - 实验三:单周期 CPU 37 | - 从该实验就要接触简单的 CPU 设计了,读者需要完成一个简单的单周期 CPU 的设计,该单周期 CPU 需要支持规定的若干条简单指令,能够仿真通过测试用例,能够下板通过测试用例。 38 | - 先修理论课程:计算机组成原理,体系结构 39 | - [实验介绍](./lab3/introduction.md) 40 | - [单周期实验指导](./lab3/singlecycle.md) 41 | 42 | - 实验四:多周期 CPU 43 | - 本实验是一个可选实验,读者可跳过直接实现流水线 CPU 的设计。多周期本身也是 CPU 设计的一种方式,设计过程相对流水线比较简单,感兴趣可以了解。 44 | - 先修理论课程:计算机组成原理,体系结构 45 | 46 | - 实验五:简单流水线 47 | - 本实验是要求完成一个简单的流水线 CPU 的设计。完成此实验,读者应具备一个基本的经典五级流水线的设计能力。 48 | - 先修理论课程:计算机组成原理,体系结构 49 | - [实验介绍](./lab5/introduction.md) 50 | - [接口简介](./lab5/soc-interface.md) 51 | 52 | - 实验六:算法小程序运行 53 | - 能够将数据结构或算法导论课上的一些简单算法用 C 语言实现,并使用交叉编译工具链将其编译成 MIPS CPU 可执行的文件,之后将小程序加载至自己实现的 CPU 上运行,由此了解软件是如何在硬件上工作的。 54 | - 先修理论课程:C 语言,数据结构,算法导论,计算机组成原理,体系结构 55 | 56 | - 实验七:Cache 设计 57 | - 本实验进行一个简单的 cache 设计,能够对 cache 原理有一个认识。 58 | - 先修理论课程:计算机组成原理,体系结构 59 | - [实验介绍](./lab7/introduction.md) 60 | - [Cache 实验指导](./lab7/cache.md) 61 | 62 | - 实验八:pmon 运行 63 | - 本实验要求能够将 pmon 软件运行至自己设计的 CPU 上。 64 | - 先修理论课程:C 语言,汇编与接口,计算机组成原理,体系结构 65 | 66 | - 实验九:ucore 移植 67 | - 本实验要求能够将 ucore 操作系统移植至自己设计的 CPU 上。 68 | - 先修理论课程:C 语言,汇编与接口,数据结构,计算机组成原理,体系结构,操作系统 69 | 70 | - 实验十:Linux 移植 [终极目标] 71 | - 本实验要求能够将 Linux 操作系统移植至自己设计的 CPU 上。 72 | - 先修理论课程:C 语言,汇编与接口,数据结构,计算机组成原理,体系结构,操作系统 73 | 74 | 77 | 78 | - 其他相关文档 79 | - [Vivado 下载及安装](./others/install.md) 80 | - [Vivado 新建工程示例](./lab1/led.md) 81 | - [Vivado 使用小技巧](./others/vivado_skill.md) 82 | - [IP 核介绍](./others/ip.md) 83 | - [逻辑分析仪使用]() 84 | - [交叉编译工具链安装使用](./others/cross_compiler.md) 85 | 86 | ## 87 | 88 | -------------------------------------------------------------------------------- /commit_message.md: -------------------------------------------------------------------------------- 1 | # Commit Message 2 | 3 | 按照以下内容,统一 Commit Message。 4 | 5 | Angular 的 commit message 规范是目前使用最广的规范。由于本仓库只包含说明文档,所以如果按 Angular 规范来做相对来说也是比较繁琐的,而且没这个必要。仿照 Angular 规范指定一个符合我们实际情况的 commit message 规范。 6 | 7 | ## 格式: 8 | 9 | 对于文档来说,主要是 markdown 文本文件和图片(.png 和 .jpg)文件这两种,我们以 md 文件为核心。 10 | 11 | ``` 12 | (): 13 | ``` 14 | 15 | **注意:":" 后有空格** 16 | 17 | ### type 18 | type 只允许是以下几个关键词。 19 | 20 | - add:增加一个文件或在文件增加内容,如果增加文本文件同时附带有图片文件,那么在 `` 处只写上文本文件名,不添加图片名。除非是单独的添加一个图片。对以下其他操作同样处理。 21 | - 举例: 22 | 23 | ``` 24 | add(README.md README-en.md): 添加 README 文件 25 | add(img/p1.png): 添加 p1.png 26 | ``` 27 | 28 | - `add(README.md p1.png): 添加 README p1.png文件` 这种写法不被允许,因为一般添加一个 md 文件会附带很多图片文件来说明,为简化操作不记录添加的图片文件。 29 | 30 | - mod:修改文本文件 31 | - 举例: 32 | 33 | ``` 34 | mod(README.md): 修改 README.md 35 | mod(p1.png): 更换 p1.png,在p1.png 上增加标识 36 | ``` 37 | 38 | - 对于图片来说,一般更换图片算作修改 39 | - del:删除文件 40 | - 举例: 41 | 42 | ``` 43 | del(README.md): 删除 README.md 44 | del(p1.png): 删除 p1.png 45 | ``` 46 | 47 | ### file 48 | 记录操作的文件。以空格隔开,文件过多以 `...` 来做提示。 49 | - 举例: 50 | 51 | ``` 52 | add(README.md md1.md md2.md config.txt ...): 增加一系列文件 53 | ``` 54 | 55 | ### msg 56 | 本次 commit 的相关说明。 57 | 58 | ### 要点 59 | - 优先级是`文本文件` > `图片文件`,有文本文件改变先记录文本文件。之后是 `add` > `mod` > `del`,按此优先级记录操作。 60 | - 文档的操作方式较为单一,就是增、删、改。如有其他操作,请添加至此文件。 61 | - `` 部分尽量详细,句末**没有**句号。 62 | - 尽量将 commit message 简化到一行。 63 | - 所有文件命名尽量不要使用中文 64 | 65 | -------------------------------------------------------------------------------- /img/lab1/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p1.png -------------------------------------------------------------------------------- /img/lab1/p10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p10.png -------------------------------------------------------------------------------- /img/lab1/p11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p11.png -------------------------------------------------------------------------------- /img/lab1/p12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p12.png -------------------------------------------------------------------------------- /img/lab1/p13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p13.png -------------------------------------------------------------------------------- /img/lab1/p14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p14.png -------------------------------------------------------------------------------- /img/lab1/p15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p15.png -------------------------------------------------------------------------------- /img/lab1/p16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p16.png -------------------------------------------------------------------------------- /img/lab1/p17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p17.png -------------------------------------------------------------------------------- /img/lab1/p18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p18.png -------------------------------------------------------------------------------- /img/lab1/p19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p19.png -------------------------------------------------------------------------------- /img/lab1/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p2.png -------------------------------------------------------------------------------- /img/lab1/p20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p20.png -------------------------------------------------------------------------------- /img/lab1/p21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p21.png -------------------------------------------------------------------------------- /img/lab1/p22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p22.png -------------------------------------------------------------------------------- /img/lab1/p23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p23.png -------------------------------------------------------------------------------- /img/lab1/p24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p24.png -------------------------------------------------------------------------------- /img/lab1/p25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p25.png -------------------------------------------------------------------------------- /img/lab1/p26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p26.jpg -------------------------------------------------------------------------------- /img/lab1/p27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p27.jpg -------------------------------------------------------------------------------- /img/lab1/p28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p28.png -------------------------------------------------------------------------------- /img/lab1/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p3.png -------------------------------------------------------------------------------- /img/lab1/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p4.png -------------------------------------------------------------------------------- /img/lab1/p5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p5.png -------------------------------------------------------------------------------- /img/lab1/p6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p6.png -------------------------------------------------------------------------------- /img/lab1/p7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p7.png -------------------------------------------------------------------------------- /img/lab1/p8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p8.png -------------------------------------------------------------------------------- /img/lab1/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab1/p9.png -------------------------------------------------------------------------------- /img/lab3/2020-09-09-lab3-vivado-add-directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab3/2020-09-09-lab3-vivado-add-directory.png -------------------------------------------------------------------------------- /img/lab3/2020-09-09-lab3-vivado-verify-design-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab3/2020-09-09-lab3-vivado-verify-design-source.png -------------------------------------------------------------------------------- /img/lab3/2020-09-09-vivado-load-coe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab3/2020-09-09-vivado-load-coe.png -------------------------------------------------------------------------------- /img/lab3/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab3/p1.png -------------------------------------------------------------------------------- /img/lab3/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab3/p2.png -------------------------------------------------------------------------------- /img/lab5/2020-09-18-hardware-connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-18-hardware-connected.png -------------------------------------------------------------------------------- /img/lab5/2020-09-18-hardware-run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-18-hardware-run.png -------------------------------------------------------------------------------- /img/lab5/2020-09-18-verify-vivado-hdl-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-18-verify-vivado-hdl-source.png -------------------------------------------------------------------------------- /img/lab5/2020-09-18-vivado-simulation-pad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-18-vivado-simulation-pad.png -------------------------------------------------------------------------------- /img/lab5/2020-09-22-seg-map-zh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-22-seg-map-zh.png -------------------------------------------------------------------------------- /img/lab5/2020-09-22-seg-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-22-seg-map.png -------------------------------------------------------------------------------- /img/lab5/2020-09-22-trace-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-22-trace-error.png -------------------------------------------------------------------------------- /img/lab5/2020-09-22-trace-running.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-22-trace-running.png -------------------------------------------------------------------------------- /img/lab5/2020-09-22-trace-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab5/2020-09-22-trace-success.png -------------------------------------------------------------------------------- /img/lab5/read_data.svg: -------------------------------------------------------------------------------- 1 | clkresetndata_sram_endata_sram_wendata_sram_addrd_addr_2data_sram_wdatadata_sram_rdatadata_2 2 | -------------------------------------------------------------------------------- /img/lab5/read_inst.svg: -------------------------------------------------------------------------------- 1 | clkresetninst_sram_eninst_sram_weninst_sram_addri_addr_1inst_sram_rdataLUI 2 | -------------------------------------------------------------------------------- /img/lab7/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p1.png -------------------------------------------------------------------------------- /img/lab7/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p2.png -------------------------------------------------------------------------------- /img/lab7/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p3.png -------------------------------------------------------------------------------- /img/lab7/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p4.png -------------------------------------------------------------------------------- /img/lab7/p5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p5.png -------------------------------------------------------------------------------- /img/lab7/p6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p6.png -------------------------------------------------------------------------------- /img/lab7/p7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/lab7/p7.png -------------------------------------------------------------------------------- /img/others/p1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p1.jpg -------------------------------------------------------------------------------- /img/others/p10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p10.png -------------------------------------------------------------------------------- /img/others/p11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p11.png -------------------------------------------------------------------------------- /img/others/p12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p12.png -------------------------------------------------------------------------------- /img/others/p13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p13.png -------------------------------------------------------------------------------- /img/others/p14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p14.png -------------------------------------------------------------------------------- /img/others/p15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p15.png -------------------------------------------------------------------------------- /img/others/p16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p16.png -------------------------------------------------------------------------------- /img/others/p17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p17.png -------------------------------------------------------------------------------- /img/others/p18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p18.png -------------------------------------------------------------------------------- /img/others/p19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p19.png -------------------------------------------------------------------------------- /img/others/p2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p2.jpg -------------------------------------------------------------------------------- /img/others/p20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p20.png -------------------------------------------------------------------------------- /img/others/p21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p21.png -------------------------------------------------------------------------------- /img/others/p22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p22.png -------------------------------------------------------------------------------- /img/others/p23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p23.png -------------------------------------------------------------------------------- /img/others/p24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p24.png -------------------------------------------------------------------------------- /img/others/p25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p25.png -------------------------------------------------------------------------------- /img/others/p27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p27.png -------------------------------------------------------------------------------- /img/others/p28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p28.png -------------------------------------------------------------------------------- /img/others/p29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p29.png -------------------------------------------------------------------------------- /img/others/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p3.png -------------------------------------------------------------------------------- /img/others/p30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p30.png -------------------------------------------------------------------------------- /img/others/p31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p31.png -------------------------------------------------------------------------------- /img/others/p32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p32.png -------------------------------------------------------------------------------- /img/others/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p4.png -------------------------------------------------------------------------------- /img/others/p5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p5.png -------------------------------------------------------------------------------- /img/others/p6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p6.png -------------------------------------------------------------------------------- /img/others/p7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p7.png -------------------------------------------------------------------------------- /img/others/p8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p8.png -------------------------------------------------------------------------------- /img/others/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bit-mips/bitmips_experiments_doc/3e87fe78509f50d7ead30807f6722201eea84701/img/others/p9.png -------------------------------------------------------------------------------- /lab1/introduction.md: -------------------------------------------------------------------------------- 1 | # lab1 跑马灯 & 数码管 2 | 3 | 本实验是很简单的基础实验,大家可以选择性的来做。 4 | 5 | ## 实验要求 6 | - 能够使用 Vivado 工具创建项目 7 | - 能够编写简单的 Verilog 代码 8 | - 能够看懂仿真文件,并尝试自己写仿真文件 9 | - 能够创建管脚约束文件 10 | - 能够将本实验中的两个小实验分别通过仿真测试 11 | - 能够将本实验中的两个小实验分别下板至精工开发板并达到要求效果 12 | 13 | ## 实验内容 14 | 本实验包括两个部分。 15 | 16 | ### 跑马灯实验 17 | 本实验需要使用 Vivado 来创建一个工程,并且编写简单代码,实现一个跑马灯的效果,需要使用的板载资源是精工开发板上的 8 个 led 灯。如何实现跑马灯的效果?一个简单的思路就是每隔一段固定时间就让 8 个 led 灯逐个亮起来,每次只保证一个亮。依次循环往复。 18 | 19 | [跑马灯实验流程指导](./led.md) 20 | 21 | 本系列实验只有跑马灯这一个实验工程需要手动创建,其他所有实验的工程都已创建好,请先将[实验代码](https://github.com/bit-mips/bitmips_experiments)克隆至本地。 22 | 23 | ### 数码管显示实验 24 | 本实验需要使用的板载资源是精工开发板上的 8 个 7 段数码管,数码管要求能够显示 0 ~ 9、a ~ f 即能够表示 16 进制中的16个字符。 25 | 26 | [数码管显示实验流程指导](./num_led.md) 27 | 28 | 此实验不用再重新手动创建工程,只需使用 Vivado 打开 `lab1` 下的 `num_led` 工程即可,然后在其中填写代码。 29 | -------------------------------------------------------------------------------- /lab1/led.md: -------------------------------------------------------------------------------- 1 | # 跑马灯实验流程指导 2 | 3 | ## 1. 创建 Vivado 工程 4 | - 首先将本系列[实验代码](https://github.com/bit-mips/bitmips_experiments)克隆至本地,然后本实验会在该系列实验目录下创建一个工程 5 | ``` 6 | git clone git@github.com:bit-mips/bitmips_experiments.git 7 | ``` 8 | 9 | - 打开 Vivado,点击 `Create Project` 来创建一个新的工程 10 | 11 | ![](../img/lab1/p1.png) 12 | 13 | - 点击 `Next` 14 | 15 | ![](../img/lab1/p2.png) 16 | 17 | - 然后填写项目名称,工程路径选中刚才克隆至本地的本系列实验代码目录,即 `.../bitmips_experiments/lab1`,`Create project subdirectory` 选项选中,目的是在该工程路径下再创建一个子目录以更好的管理项目。然后点击 `Next`。**注意:路径中不要有中文!!!** 18 | 19 | ![](../img/lab1/p3.png) 20 | 21 | - 然后选中 `RTL Project`,同时选中 `Do not specify sources at this time`,这个选中之后可以在后期再添加源文件,此时项目创建过程中不用添加。不勾选也许 22 | 23 | ![](../img/lab1/p4.png) 24 | 25 | - 然后选择开发板,精工开发板的型号是下面这个,直接粘贴到 `Search` 处搜索。选择目标开发板,点击 `Next` 26 | 27 | ``` 28 | xc7a35tcsg324-1 29 | ``` 30 | 31 | ![](../img/lab1/p5.png) 32 | 33 | - 查看 Summary,没有问题就点击 `Finish` 完成创建 34 | 35 | ![](../img/lab1/p6.png) 36 | 37 | ## 2. 创建源文件 38 | - 完成工程创建之后,Vivado 会打开此工程。点击 `+` 可以创建文件 39 | - 在 `source` 处可以看到本工程的文件结构: 40 | - Design Sources:代码源文件 41 | - Constraints:约束文件 42 | - Simulation Sources:仿真文件 43 | 44 | ![](../img/lab1/p7.png) 45 | 46 | - 选择 `Add or Create design sources` 来创建一个工程设计源文件。点击 `Next` 47 | 48 | ![](../img/lab1/p8.png) 49 | 50 | - 选择创建一个文件 51 | 52 | ![](../img/lab1/p9.png) 53 | 54 | - 给文件命名,路径默认即可,文件类型为 `Verilog`,之后一路 `Next`、`OK`、`Finish` 即可 55 | 56 | ![](../img/lab1/p10.png) 57 | 58 | - 然后双击刚才创建的文件,编辑文件。将以下代码复制粘贴至该文件。**需要补全该代码**,实现跑马灯功能。 59 | 60 | ``` 61 | `timescale 1ns / 1ps 62 | 63 | module led#( 64 | parameter DELAY_CYCLE = 50000000 65 | )( 66 | input wire clk, 67 | input wire rst, 68 | 69 | output wire[7:0] led_o 70 | ); 71 | /******** your code ********/ 72 | 73 | 74 | endmodule 75 | ``` 76 | 77 | ![](../img/lab1/p11.png) 78 | 79 | 80 | 81 | - `led.v` 接口说明: 82 | |信号|类型|位宽|说明| 83 | |-|-|-|-| 84 | |clk|input|1|时钟信号| 85 | |rst|input|1|复位信号| 86 | |led_o|output|8|led 控制信号,高电平 led 亮,低电平 led 暗| 87 | 88 | - 该 `led` 模块被设计为可配置模块(见本文最后对可配置模块的介绍),参数 `DELAY_CYCLE` 是一个可配置参数,本模块要求每过 `DELAY_CYCLE` 个时钟周期输出信号 `led_o` 的值发生改变,改变顺序如下:`0x01 -> 0x02 -> 0x04 -> 0x08 -> 0x10 -> 0x20 -> 0x40 -> 0x80 -> 0x01 ...`,由此循环往复,这样可以控制 led 灯从第 1 个到第 8 个逐个亮灭。设置 `DELAY_CYCLE` 可配置参数的好处就是,在仿真的时候我们可以使用一个较小的数,在下板时使用默认的较大的数,这样在仿真和下板是都能较好的观测到相应的变化。 89 | 90 | ## 3. 创建仿真源文件 91 | - 同创建设计源文件一样点击那个 "+",然后选择 `Add or create simulation sources` 92 | 93 | ![](../img/lab1/p12.png) 94 | 95 | - 然后 `Create file`,默认路径,命名为 `testbench`,之后一路 `Next`、`OK`、`Finish` 即可 96 | 97 | ![](../img/lab1/p13.png) 98 | 99 | - 右键单击 `testbench.v` 文件,点击 `Set as top` 将其设置为 top 文件 100 | 101 | ![](../img/lab1/p14.png) 102 | 103 | - 将以下代码复制粘贴进 `testbench.v` 文件 104 | 105 | ``` 106 | module testbench(); 107 | 108 | reg clk, rst; 109 | wire[7:0] led; 110 | 111 | always #5 clk = ~clk; 112 | 113 | initial begin 114 | rst = 1'b0; 115 | clk = 1'b0; 116 | #100 117 | rst = 1'b1; 118 | end 119 | 120 | led #( 121 | .DELAY_CYCLE(100) 122 | ) led0( 123 | .clk(clk), 124 | .rst(rst), 125 | 126 | .led_o(led) 127 | ); 128 | 129 | endmodule 130 | ``` 131 | 132 | ## 4. 执行仿真测试 133 | 待设计文件和仿真文件都准备好之后就可以进行仿真了,点击 `Run Simulation` 稍等即可。 134 | 135 | 下图即显示的是仿真波形图,可以看到信号 `led` 正按照预期结果来改变。下图是 16 进制结果显示的。**(注意缩放波形图来观测)** 136 | 137 | ![](../img/lab1/p15.png) 138 | 139 | ## 5. 创建约束文件 140 | 约束文件可以直接通过文本编辑的方式来进行编写,但是这种方式不太适合初学者,下面介绍使用可视化界面操作来创建。 141 | 142 | - 首先将工程综合,点击下图中的综合 `Run Synthesis` 143 | 144 | ![](../img/lab1/p16.png) 145 | 146 | - 综合完会弹出一个界面,选择 `Open Synthesized Design`,也可在左侧边栏 `SYNTHESIS -> Open Synthesized Design` 处打开 147 | 148 | ![](../img/lab1/p17.png) 149 | 150 | - 点击工具栏 `Windows -> I/O Ports`,之后在 `I/O Ports` 中即可配置管脚 151 | 152 | ![](../img/lab1/p18.png) 153 | 154 | - 相关配置如图,关于引脚 `Pin` 对应的值可以查看开发板手册。然后 `ctrl + S` 保存文件 155 | 156 | ![](../img/lab1/p19.png) 157 | 158 | ![](../img/lab1/p20.png) 159 | 160 | - 此时退出 `Open Synthesized Design`,在 `Sources -> Constraints` 处可以看到刚才保存的约束文件 161 | 162 | ## 6. 生成 bit 流并下板测试 163 | - 有了约束文件之后就可以开始实现,点击 `IMPLEMENTATION -> Run Implementation` 进行实现。在弹出框点击 `Generate Bitstream`, 或者直接点击左侧边栏的 `PROGRAM AND DEBUG -> Generate Bitstream`。 164 | 165 | ![](../img/lab1/p21.png) 166 | 167 | - 生成比特流之后,打开 `Open Hardware Manager`, 168 | 169 | ![](../img/lab1/p22.png) 170 | 171 | - 将开发板链接电脑,然后点击下图自动链接按钮 172 | 173 | ![](../img/lab1/p23.png) 174 | 175 | - 选中板子然后 `Program device` 176 | 177 | ![](../img/lab1/p24.png) 178 | 179 | - 然后选中刚才生成的比特流文件,一般默认就是,然后 `Program` 180 | 181 | ![](../img/lab1/p25.png) 182 | 183 | - 下板之后就可以观测板子运行结果是否与预想的一致 184 | 185 | 186 | ## 可配置模块说明 187 | 将模块设计为可配置模块时,可以方便的对模块进行配置,而无需改动模块代码。因此,我们极力推荐将模块设计为可配置的,这样能够根据不同需求将模块进行配置适用于不同的场景。 188 | 189 | 一个可配置模块写法如下: 190 | ``` 191 | module module_name#( 192 | parameter p1 = value1, 193 | parameter p2 = value2, 194 | ... 195 | )( 196 | // 正常输入输出信号 197 | input wire A, 198 | input wire B, 199 | output wire C, 200 | ... 201 | ); 202 | 203 | // 具体代码部分使用参数 p1,p2 204 | endmodule 205 | ``` 206 | 207 | 以上模块在调用时,如果没有指定 p1,p2 这些参数的值,那么就会使用默认的 value1,value2 208 | 209 | 下面代码使用上述模块: 210 | ``` 211 | module_name #( 212 | .p1(new_value1), 213 | .p2(new_value2), 214 | ... 215 | ) module_instance( 216 | .A(), 217 | .B(), 218 | .C(), 219 | ... 220 | ); 221 | ``` 222 | 223 | 上述代码即对该模块里的参数进行了重定义,更新为 new_value1,new_value2。这样不同调用者可能有不同的参数,可以很方便的使用。 224 | 225 | -------------------------------------------------------------------------------- /lab1/num_led.md: -------------------------------------------------------------------------------- 1 | # 数码管显示实验流程指导 2 | 3 | 使用 Vivado 打开 `lab1` 下的 `num_led` 工程。 4 | 5 | ## 数码管介绍 6 | 7 | 本实验最后也是会将工程生成 bit 流来下板运行的,使用的开发板是精工开发板。在精工开发板上集成有 8 个 7 段数码管,本实验即要使用这 8 个数码管。 8 | 9 | 7 段数码管为共阴极数码管,即公共极输入低电平,那么就需要提供正向信号(即高电平)来使得数码管被点亮,同时每个数码管还有一个 `段选信号`(类似于片选信号),这就是一个使能信号,要想数码管被点亮,该端也需要接高电平。 10 | 11 | 管脚约束如下: 12 | 13 | |名称|原理图标号|FPGA IO PIN| 14 | |-|-|-| 15 | |A0 |LED0_CA|B4| 16 | |B0 |LED0_CB|A4| 17 | |C0 |LED0_CC|A3| 18 | |D0 |LED0_CD|B1| 19 | |E0 |LED0_CE|A1| 20 | |F0 |LED0_CF|B3| 21 | |G0 |LED0_CG|B2| 22 | |DP0|LED0_DP|D5| 23 | |A1 |LED1_CA|D4| 24 | |B1 |LED1_CB|E3| 25 | |C1 |LED1_CC|D3| 26 | |D1 |LED1_CD|F4| 27 | |E1 |LED1_CE|F3| 28 | |F1 |LED1_CF|E2| 29 | |G1 |LED1_CG|D2| 30 | |DP1|LED1_DP|H2| 31 | |DN0_K1|LED_BIT1|G2| 32 | |DN0_K2|LED_BIT2|C2| 33 | |DN0_K3|LED_BIT3|C1| 34 | |DN0_K4|LED_BIT4|H1| 35 | |DN1_K1|LED_BIT5|G1| 36 | |DN1_K2|LED_BIT6|F1| 37 | |DN1_K3|LED_BIT7|E1| 38 | |DN1_K4|LED_BIT8|G6| 39 | 40 | 41 | - DN0_K1,DN0_K2,DN0_K3,DN0_K4 42 | - 这几个信号是右边四个数码管的段选信号 43 | - A0,B0,C0,D0,E0,F0,G0,DP0 44 | - 这几个信号是一组用来控制右边的四个数码管的亮暗 45 | - DN1_K1,DN1_K2,DN1_K3,DN1_K4 46 | - 这几个信号是左边四个数码管的段选信号 47 | - A1,B1,C1,D1,E1,F1,G1,DP1 48 | - 这几个信号是一组用来控制左边的四个数码管的亮暗 49 | 50 | 举例: 51 | - 假如要控制最右边和最左边两个数码管亮,那么就可以让 DN0_K1 和 DN1_K1 置高电平,其他段选信号置低电平,此时这两个数码管就被“选中”,其具体的显示内容就需要根据 A0 ~ G0 和 A1 ~ G1 来确定。 52 | - 假如 DN0_K1 和 DN0_K2 被置高电平,那么最右边两个数码管就被选中,且他们显示的内容是一样的,都是由 A0 ~ G1 来确定。 53 | 54 | A ~ G 信号具体控制数码管中的各段如下图: 55 | 56 | ![](./../img/lab1/p28.png) 57 | 58 | 举例: 59 | - 让 A,B,G,E,D 置高电平即是显示出数字 “2” 60 | 61 | 具体的十六进制中 16 个字符的显示如下: 62 | 63 | ![](../img/lab1/p26.jpg) ![](../img/lab1/p27.jpg) 64 | 65 | 但是有个问题必需考虑,因为在同一**时刻**,数码管最多只能提供两组控制信号(即 CA0 ~ CF0 和 CA1 ~ CF1),也就是说只能在同一**时刻**显示出两个数码管,那么肉眼该如何看到 8 个数码管同时显示的数值呢?我们知道,人眼是有`视觉暂留`效应的,即我们看到的景象不会立刻消失,基于这一点,我们可以在短时间内快速改变控制数码管显示的值和段选信号,就是说每个数码管只显示极短的时间,然后换下一个数码管显示,这样肉眼就能看到每个数码管都在显示。 66 | 67 | ## 实验说明 68 | 69 | 使用 Vivado 打开项目中的 `num_led.v` 文件,需要在该文件内补充数码管显示部分的代码。 70 | 71 | ### 关于输入 72 | 本实验会使用到开发板上的一个按键,8 个拨码开关,8 个数码管。使用拨码开关和按键作为输入,即每次拨动拨码开关来作为输入,按下按键确定输入,输入 4 次即确定一个 32 位的数据,数码管需要显示这 32 位数据值。 73 | 74 | 举例: 75 | - 第一次拨动拨码开关,假如其状态为 `上,下,下,下,上,上,下,上`,对应二进制就是 `1000_1101`,按下按键,那么这个 `1000_1101` 就会保存到一个 32 位宽的 reg 型数组的低 8 位,即第一个字节 76 | - 第二次输入的值会保存到这个数组的第二个字节,以此类推。输入满 4 次即可重新开始输入。 77 | 78 | 这部分代码是已经写好的,读者可尝试理解。 79 | 80 | ### 显示参考方案 81 | 82 | 根据上面的数码管显示原理可以知道,8 个数码管可以显示出 32 位的数据,即每个数码管显示其中 4 位数据(使用 0 ~ f 表示)。 83 | 84 | 由于只有两组控制信号(CA0 ~ CF0 和 CA1 ~ CF1),那么在同一时刻只能控制显示两个数码管。那么我们可以考虑如下的一个显示方案: 85 | - 有两组段选信号(DN0 和 DN1),分别控制左侧四个数码管和右侧四个数码管的使能。可以每隔一段时间来更替段选信号选中的数码管,即某一时刻 DN0_K1 和 DN1_K1 使能,下一时刻 DN0_K2 和 DN1_K2 使能,下一时刻 DN0_K3 和 DN1_K3 使能,下一时刻 DN0_K4 和 DN1_K4 使能,然后循环控制。 86 | - 当 DN0_K1 和 DN1_K1 使能时,就让 LED0_CA ~ LED0_CF 控制信号来控制 LED_BIT1 显示,让 LED1_CA ~ LED1_CF 控制信号来控制 LED_BIT5显示。当 DN0_K2 和 DN1_K2 使能时,就让 LED0_CA ~ LED0_CF 控制信号来控制 LED_BIT2 显示,让 LED1_CA ~ LED1_CF 控制信号来控制 LED_BIT6显示。以此类推。 87 | 88 | 89 | **关于变量定义:** 90 | 数码管需要显示的是 `num_led_value` 的值,该变量定义如下: 91 | ``` 92 | reg[31:0] num_led_value; 93 | ``` 94 | 95 | 数码管部分代码如下: 96 | ``` 97 | reg [COUNTER_WIDTH - 1:0] count; 98 | reg [3:0] scan_data1, scan_data2; 99 | reg [7:0] scan_enable; 100 | reg [6:0] num_a_g1, num_a_g2; 101 | 102 | assign digital_cs = scan_enable; 103 | assign digital_num0 = num_a_g1; 104 | assign digital_num1 = num_a_g2; 105 | ``` 106 | 107 | 上述代码中,变量 `scan_enable` 即是控制数码管的段选信号,这是一个 8 位宽的 reg 型变量,修改他的值可以控制选择的数码管。`num_a_g1` 和 `num_a_g2` 即是两组具体控制数码管显示值得信号,通过对其赋值可控制数码管显示的内容。 108 | 109 | **关于显示时间的间隔:** 110 | 通过上述数码管的显示原理可知,8 个数码管是分时段来显示的,那么这个时段该为多长? 111 | 112 | 在上述代码中有一个 `count` 变量,这个变量是用来计数的,每一个时钟周期记一个数,通过 `count` 的计数值即可来确定这个时间段。 113 | 114 | ``` 115 | always @ (posedge clk) begin 116 | if (rst == `RST_ENABLE) begin 117 | count <= 0; 118 | end else begin 119 | count <= count + 1; 120 | end 121 | end 122 | 123 | always @ (posedge clk) begin 124 | if (rst == `RST_ENABLE) begin 125 | scan_data1 <= 4'b0; 126 | scan_data2 <= 4'b0; 127 | scan_enable <= 8'b0; 128 | end else begin 129 | case(count[COUNTER_WIDTH - 1:COUNTER_WIDTH - 2]) 130 | 2'b00: begin 131 | scan_data1 <= num_led_value[3:0]; 132 | scan_data2 <= num_led_value[19:16]; 133 | scan_enable <= 8'b0001_0001; 134 | end 135 | /****** your code ******/ 136 | 137 | default: ; 138 | endcase 139 | end 140 | end 141 | ``` 142 | 143 | 上述代码第一个 `always` 语句中实现 `count` 的计数功能。第二个 `always` 语句实现对段选信号的赋值。其中使用到了 `case` 语句。进一步分析可知,对段选信号是通过判断 `count` 的高两位的值来进行循环赋值的。 144 | 145 | |count 高两位值|段选信号值| 146 | |-|-| 147 | |2'b00|8'b0001_0001| 148 | |2'b01|8'b0010_0010| 149 | |2'b10|8'b0100_0100| 150 | |2'b11|8'b1000_1000| 151 | 152 | 其中 `count` 具体的位宽是由参数 `COUNTER_WIDTH` 来决定的。该[参数是可配置](./led.md#可配置模块说明)的,由此适用于仿真和下板这两种时间跨度要求差距很大的情况。默认 `COUNTER_WIDTH` 值为 20,即 count 位宽为 20,则每隔 2^18 个时钟周期使能信号就会变更一次。板载时钟是 100MHz,则这个时间大约是 0.0026 秒,适合下板。如要仿真,可将这个值改小。 153 | 154 | **关于控制显示内容:** 155 | ``` 156 | always @ (posedge clk) begin 157 | if (rst == `RST_ENABLE) begin 158 | num_a_g1 <= 7'b0; 159 | num_a_g2 <= 7'b0; 160 | end else begin 161 | case(scan_data1) 162 | 4'd0: num_a_g1 <= 7'b111_1110; // 0 163 | /****** your code ******/ 164 | 165 | default: ; 166 | endcase 167 | 168 | case(scan_data2) 169 | 4'd0: num_a_g2 <= 7'b111_1110; // 0 170 | /****** your code ******/ 171 | 172 | default: ; 173 | endcase 174 | end 175 | end 176 | ``` 177 | 178 | 上面的 `always` 语句即是来控制数码管显示具体内容的。同一时刻可以显示两个数码管(使用两种控制信号)。`scan_data1` 和 `scan_data2` 即是要显示的数字,这两个变量在给 `scan_enable` 赋值的同时给赋值。例如,`scan_data1` 值为 0,控制信号 `num_a_g1` 就要给出 `7'b111_1110` 的值,由此控制数码管中的 A、B、C、D、E、F 段使之显示数字 “0”。 179 | 180 | ### 仿真 181 | 读者可自行尝试编写仿真文件,在一些特定时刻给予一个特定的输入,然后观测输出是否合理。 182 | 183 | 上述方案是一个参考方案,理解数码管显示原理即可,也可不按这种方式来显示数码管,只要最终能控制数码管亮就行。 -------------------------------------------------------------------------------- /lab3/example-wavedrom.json: -------------------------------------------------------------------------------- 1 | {signal: [ 2 | {name: 'clk', wave: 'p......'}, 3 | {name: 'rst', wave: '10.....'}, 4 | {name: 'inst_rom_addr', wave: 'x.345x.', data:["i_addr_1", "i_addr_2", "i_addr_3"]}, 5 | {name: 'inst_rom_rdata', wave: 'x.345x.', data: ["LUI","LW", "SW"]}, 6 | {}, 7 | {name: 'data_ram_addr', wave: 'x..45x.', data:["d_addr_2","d_addr_3"]}, 8 | {name: 'data_ram_wen', wave: '0...10.'}, 9 | {name: 'data_ram_wdata', wave: 'x...5x.', data: ["data_3"]}, 10 | {name: 'data_ram_rdata', wave: 'x..4x..', data: ["data_2"]}, 11 | ], config: {hscale: 3}} 12 | -------------------------------------------------------------------------------- /lab3/introduction.md: -------------------------------------------------------------------------------- 1 | # 单周期 CPU 设计 2 | 3 | 本实验将设计并实现一个 MIPS 单周期 CPU。 4 | 5 | ## 实验要求 6 | 7 | - 能够对 MIPS 指令编码有一定了解 8 | - 能够对 SOC 有一定认识 9 | - 能够掌握单周期 CPU 的设计模式,并使用 Verilog 编写一个单周期 CPU 10 | - 能够完成本实验并通过仿真测试 11 | - 能够将本实验代码生成 bit 流并下板至精工开发板达到预计效果 12 | 13 | ## 这个 lab 包含什么内容? 14 | 15 | 本 lab 提供了一个适用于精工开发板的 SOC,并提供了两个可下板程序。 16 | 17 | 18 | ## 这个 lab 如何帮助你? 19 | 20 | 在看到这里的时候,你应该正在计划或者已经实现了一个 MIPS 单周期 CPU。 21 | 22 | 但是以北理工的小学期个人实验为例,此时你的 CPU 只能读取运行测试代码,而暂且无法访问外部设备。 23 | 24 | **本 lab 中提供的 SOC 能够帮助你在不需要了解硬件标准的情况下,完成精工开发板的设备访问。** 25 | 26 | 用白话来说就是:写好 CPU 软件部分后,只需要修改一下接口,就能下板跑一些花里胡哨(指二极管)的程序。 27 | 28 | 29 | ## 实验内容 30 | 31 | 本实验需要实现一个 MIPS 指令集架构的单周期 CPU,能够完成 7 条简单指令的实现,之后能够自行再添加指令。(本实验中不考虑异常处理,仅实现指令的基本功能。) 32 | 33 | 本实验的实验代码在对应的代码仓库中的 lab3,实验代码中,已经搭建好了一个基本的 SOC 环境,同时也编写了一套对应的测试代码。做实验时,只需关注基本的单周期 CPU 的设计,而不用去关注除 CPU 的外部环境和测试代码的编写。最终,在通过仿真测试之后也能进行下板操作,下板之后可以看到相应的效果。 34 | 35 | 在进行实验之前请先阅读相关文档,对本实验的实验代码结构有一定的了解,对一些基本概念有一个认识,之后再根据实验步骤完成相应模块的代码编写。 36 | 37 | 需要实现的指令如下: 38 | 39 | - LUI 40 | - ORI 41 | - ADD 42 | - SW 43 | - LW 44 | - BEQ 45 | - J 46 | 47 | 具体指令定义请参看 MIPS 指令集手册。 48 | 49 | ## SOC 使用步骤 50 | 51 | ### 下载项目 52 | 53 | ```bash 54 | git clone https://github.com/bit-mips/bitmips_experiments.git 55 | ``` 56 | 57 | ### 使用 Vivado 打开项目 58 | 59 | 点击 `Open Project`,选中 `bitmips_experiments/lab3/single_cycle/single_cycle.xpr` 进入项目。 60 | 61 | ### 添加你的 CPU 项目 62 | 63 | **注意,首先你需要按照[单周期实验指导](./singlecycle.md)修改自己 CPU 的接口,适配 SOC。** 64 | 65 | 在主面板 `Project Manager > Source` 中点击 `+` ,并将满足接口要求的 CPU 文件夹添加到项目中。 66 | 67 | ![](../img/lab3/2020-09-09-lab3-vivado-add-directory.png) 68 | 69 | 作为验证,确保 `Source` 面板中 `single_cycle` 下有你的 CPU 实现文件。 70 | 71 | ![](../img/lab3/2020-09-09-lab3-vivado-verify-design-source.png) 72 | 73 | ### 生成比特流、下板并验证实验效果 74 | 75 | 其余步骤同正常下板流程。 76 | 77 | 78 | 实验效果见[单周期实验指导-测试用例说明](./singlecycle.md#%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E8%AF%B4%E6%98%8E)。 79 | 80 | ### 选择另一个 COE 文件 81 | 82 | 默认情况下, 我们加载的是 8 bit 加法器的程序指令。如果我们想要选择其他的 COE 文件,可以在 `Source` 面板中双击 `inst_rom` ip 核,然后在 `RST & Initialization` 中选择相应的 COE 文件。 83 | 84 | ![](../img/lab3/2020-09-09-vivado-load-coe.png) 85 | 86 | -------------------------------------------------------------------------------- /lab3/single_cycle.drawio: -------------------------------------------------------------------------------- 1 | 7R3ZcpvI9mv0aBd0sz7GTjypmklNqlL33vjJxUjYYoKEBqGxna+/INEITrfE1ptQ8hLROmrD2bc+zPD96u23NNgsvySLMJ4hY/E2wx9nCJmeY+f/FSvvhxXbMg4LL2m0KIGOC9+in2G5SMB20SLcNgCzJImzaNNcnCfrdTjPGmtBmiavTbDnJG7+1U3wElIL3+ZBTK/+L1pky8Oqh9zj+ucwelmSv2w6/uGbVUCAyyfZLoNF8lpbwp9m+D5NkuzwafV2H8YF8gheDr97OPFtdWNpuM66/ODR+uT88V/n9z+jb4+fv37+e/Xlu3WDDrv8G8S78oHLm83eCQbSZLdehMUmxgzfvS6jLPy2CebFt685zfO1ZbaK8ysz/1huF6ZZ+HbyPs3q6XO2CZNVmKXvOUj5gxuvRFjJMU55+XpEv09AljXU20a5GJQkf6m2PmIl/1AipgeSMIWk1fv91/9QmMqfOWuiY5ulyY/wPomTNF9ZJ+sc8u45imOwFMTRyzq/nOc4CvP1uwKDUc6FH8ovVtFiUfwZJv6bFOJBAreVBBaDAkgUAUzkUcgOF7mclpdJmi2Tl2QdxJ+OqwAtR5g/kmRT0ufvMMveS6UT7LKkSb3wLcq+lz8vPj8Wn2/t8urjW+2rj+/kYp0/8Pf6Re1XxeXxZ/sr8rsmp8wQfngw8n8VPYvHPU/NHDvJLp2HZ/BolQo0SF/C7Ayc57LZIw3jIIv+bd6IAGr7ulDbnD6t/ROqQBKtsaELrY3p09pVK9eYdi4k0tq8Lrn2FMs11oXWQy22a7TRe3/1NUyjHGeF16YfEzhjmWD/0w9pGrzXADZJtM62tZ2/FgtH99Exmu6jaYHIpAXesjBgwMMdHNmxepQxHGortTwVV/bRR0cV9NjgyAvQR46hghUts8layDjPipZzFl4UK7raOEEDlaXnXLyuRCr4E4NIm/jDp/gT4XHwli+Dny19nPrO/HzBqtXWgnOdFk60z4GLYcQSgY3sphMXObrnZH9vRwZ1/tkl5Iub7Z7FPuQAyNq8Hb/MP70U/8+zNCY75Td22OzwFc34cRxttqdSdzX2DbabQwL7OXorxIBHIo8ikkFn8li5VE9UJk9pHq8ZFbgDw4K2qICjArC7+lYjFcAoktqjhcz0WEK23sy7ypj0EgUCXiJi1CgYYuWIEitbm8yKcYuGyRWSKFeOzoYVwRCkDFRPGlYAj1tCnJuR8OB+xFhuR5BS0VenmDBSVa1TfAYJoI5ZLz4UNfb8ah4H2200Z6GlXWRppNQe2mbWeg9r/SSRZm0ThlM2wOZBlZQ/OyckXstGB11DbcQt5DKukVo+L2rBjU5Qq68qP3nHYsNvU5DynMc/umrP6bRCUCTEtF6W3AwhiLzpNvtFXtNVTV5W0qKnJpfgYw+NSeWYCo/tsvY2FCaoTGFI9t6GgrvhZ4XfurGLLmxg+bdDGQF65/RW6lmBDpr2FnuquhvkNhHRnMo0t0vhf29SrwX/pOVDGf49Cv/7HOJk8Y+a+HdMtfgnG9fwv5k/JbsJiwCCZkF1cIBYsR8nd8DyWtwBZo2/q48wvEIvKfsAAgUMjxt0Tj74zY1sWGwTnCoiHDHpVJHHi1hVIu/UTqKpRR8+idbb7ClNVk/BYpFOV7ce20iIcvVUK1fawRuuXG+MW8MwmxrWxtZVq1hK2AjG+4utqVjJ0r5oJbbpIsiCK5JbbHhq5damHdOCGFPWnVCQVGc1bYfWlBfWoCCz7wd3VNdKGhRg/0BLdz+VQ+0LD881Q11PGY1+8MR6Ca3J2Uo7vLnwv9TGN60FwATtX9j2z3M0hDdbOBQa0J7wyJHRocPwfXU/4NWvx7srP49lv1YF6w30guHhF99r7sOpywHeruudvSuYN+4L3wIOH7oJLkgWrF+y8EsWWLfrt/A2zFP1hPfOg2MPjQH3JYgOEW4dRKflRAB3/4a7sLgmdIWREC63gQtttbjcEJ7cl1jO0shBmR5nEZdTrP60WmJFeyQ8iEUFMaJG3kHnQ0+1cO9xVktdaxT7jZ5mcsLGgmjKgh32gli97fwkHJLQF16KNVc6uWmgI4yultOhGXewDkodNlX0hnckjA/xNDrJ2jmhdyuI08UPlOsWbZE4vG9wiA0TuAVSBKE1E17mLobD40GPLTYTTjc08Dm+sAjnySLU9XjfTXP8AUZ0TZSMyq0X5EwLRHD8KnICzxm0Ds4q1dixB+JotbF7XpnlF8P7H1pNMuqo0E6FWYramzBwUYX3SfQ+CUdlAM6XTCh4vwEvSDUxmjZWK5MuXU+mTwAaJMaZY7ltAvSh45wCaMoU8IEk+2op4GmUrNA/giPyI34a57A8bc/Cs92z8Azh5UwXMzRi0YGhF69yG08WtZRwKNXja/XiOO88g1p4FLgpY/ojIRD3gCjfT9doyALJycrG1cxe1TXTiIdcC5675Dfw5PJ7FKUOUep8EtxQoVk8DJIbLTVKD7al9IRHLZM4sT8SvqkZxegi/xLbFBW6f11FYPRLFviIQEv+0INphZ7wqMVdxOB+esPLcC8JTfmPVwlf8nBU2wSla0Jk291MclV+4W6QHTpVnGuUq0kF2IpTAQ49WuR5t55P+Dg3pICr+OCSw5oocTXotxjDiqWi36X1Tzph7gcOraU6GezS82zSxXTRD7mfERLLzQQrDYeb70epvH/R7ZNuqXElvVmHzkCB/Bb1UkteHbzAdbdaMmMUvIzMmEubv9XujeLK7TLYFB+zXDDDn0mx5d2mViKu1mt14zaHOk2ynIxJoQV8XrNiTvUV1gTcZQg47LTlNy/JUPqOrj4SfrLRwB/0ji6OCsPrnAUbqzDGKXM6qr1gUbJBbozUnRrdNAxRgm0S/NBLh0r30/VUbLPZZ4YY6JfrqihtOx6myET1YrZrrK4ujpqaNaaaJFuaGB3oMUk4/Gwa6BfH8ec4NWlyDLse2jiOmm8jo9+c9oULc3KhBhwBA85qh2X1T5I3g/Ov/V6+KyxPnn29K7/4xPC/rpXW3vDllDKxldlJOfBQhZKT6erkn279TbdP0x7URpWHVefbfbr7N82mPi7PI2OzdenBruZv1cjwYbr4p/psXLruLRn/tKqf8BtYKGtKxuirwz+dzPkr/GfSc8xt8HZe5bPkTYNR/NtOfOKxQ+r9uhhk02A0IGTXRgX1BpnhnB6ayZ5eJ04Lao6t4o4c02D4qIQW03ZUHQt0RxF3XRkteLz08lQ6xUct+ZRRhUUayXIODlMHtjwwBm/oGzRtSGVefQqwH8KUMMXGZL5Bsydj6c4KrRQc/IqMrrzAj1yIIlehip/S4ArekYGauFfuMpqs+R4Tkx3PBaYQ9ugMVqP22JcKdrth8ncEq1EOI0Z0Z4VWCg5Xox15gRu5CHVGuVNVRQvx799URmM4wJ2aktKdyG07CScyB/Vc+cz7+T0YOM62N0XPObe0zaanYlDRUJ1/61vG8Z99fl/hHMFjEFQl9nCek2+3HONkzHPSYQppiYPBTVKyuBJ0PznuYM0EJkE5oiI6aObw+aHkFHzzXLYg1wXRNYAqpOia5+keK6ThNvoZ/LXfquDjEof5vvbdzP5Y7LXLksMBU24D6Uww7Z0QonHg05QaOyA66V9hvWsZWHesk2nQVUKDzqJVFVg5WMd0erm3AWjGzzOEHx4K03YJhh2ebPEHa1A4ThfuJNqSk9lhp4+uzysCHU+n4+fnPanogZqVwgvXXU+tTymz0uyOsVS/Qq+6IU7kXW/mT9swvjrKglK3yWg9k0xXlgM+nK5VOWqM1OptRR3cpKFFotoaDT25NKT9xTE0zHd5mmfpCOHUm4AWCFsQ4xWxzP5PcQSkXU8uQrg3oqPUrN6UdIxm+6JF3vSqLoqwWK/p5kDKopQ0ZVJSB5QZWlU2KVmhyTi1ejdlEmLcjC4RmfLecsZcIAX5xiQ5PaZMP0ROslYna2kRlGsXbQ6tEFRy4JD3voDkgAOHQtouHD/aNT1AvUHNlpznZ75443opSQ+SHUxJktKTRkk6YEy3XbrT9VZ+FIkYs/CxXOVHR3Xz+McEEA0OfjF8dk6Izi/TpLDgRwFIg83yS7IIC4j/Aw== -------------------------------------------------------------------------------- /lab3/singlecycle.md: -------------------------------------------------------------------------------- 1 | # 单周期实验流程指导 2 | 3 | ## MIPS 简介 4 | [MIPS](https://www.mips.com/) 架构(Microprocessor without Interlocked Pipeline Stages architecture)是一种采取精简指令集的处理器架构,广泛被使用在许多电子产品、网络设备、个人娱乐设备与商业设备上。目前 MIPS 包括 32 位架构和 64 位架构,本实验实现的是 32 位架构下的若干条指令。摘自[维基百科](https://zh.wikipedia.org/zh-cn/MIPS%E6%9E%B6%E6%A7%8B)。 5 | 6 | 相关资源如下: 7 | 8 | [MIPS 指令集手册](https://www.mips.com/downloads/the-mips32-instruction-set-v6-05/) 9 | 10 | [其他 MIPS 相关资源下载](https://www.mips.com/downloads/) 11 | 12 | 本实验只需使用 MIPS 指令集手册即可。 13 | 14 | ## SOC 简介 15 | [SOC](https://zh.wikipedia.org/wiki/%E7%B3%BB%E7%BB%9F%E8%8A%AF%E7%89%87)(System on Chip)是系统级芯片的英文简称,现代处理器芯片并不只包含有一个 CPU,相反除了 CPU 之外还有其他很多部件以增强芯片功能,而其中 CPU 只是起到一个计算、控制的作用,类似于人的大脑,而系统级芯片更像是一个完整的人。除 CPU 外系统级芯片一般还会包括存储器(Flash,RAM,ROM等),用于提供脉冲的振荡器,一系列的外部设备即外设等。越复杂的系统级芯片自然功能也就越强大。 16 | 17 | 在本实验中,只需要关注核心的 MIPS 单周期 CPU 的实现,在实验代码中已经写好了一些简单外设的控制器,以及一个简单的 SRAM 总线,同时也使用 IP 核创建了一个指令存储器和一个数据存储器,其中指令存储器(相当于ROM)用来存储即将运行的指令程序,它是只读的;数据存储器(相当于RAM)是用来存储程序运行过程中的数据,它是可读可写的。 18 | 19 | 因此,在实现单周期 CPU 的过程中,只需要按照指定接口和时序来实现,然后将其挂在总线之上,那么该 CPU 即可对外设可存储器进行读写,然后运行指令程序就可以实现一定的功能,包括对外设的控制。 20 | 21 | ## 单周期简介 22 | 单周期 CPU 简单来说就是一个周期内执行完一条指令的 CPU,对于这类 CPU 来说,每条指令的完成只需要一个周期,那么 CPU 的频率就只能根据那条执行时间最长的指令来设置。因此,这类 CPU 的频率不会很高,效率也很低。但是对于本实验来说,只需要实现 7 条简单指令,同时存储器是采用 Distributed Memory Generator IP 核来生成的(使用该 IP 核生成指令和数据存储器时读取是无延时的,即本周期发出读写命令本周期即返回结果),因此一般情况下,即使使用精工开发板板载时钟 100MHz 也是可以的,无需再降频。 23 | 24 | 对于精工开发板来说,100MHz 意味着每条指令的执行周期都是小于 1/100MHz,即 10ns。以一条 LW 指令的执行为例,首先需要根据 pc 值在指令存储器取出该 LW 指令,接着会解析该指令识别出是 LW 指令,LW 指令是访存指令因此需要计算出访存地址,然后根据该地址访问数据存储器或外设,最后将取回的数据写到寄存器堆中。这一系列的操作需要在一个周期内完成,而不同的指令操作是不同的,但都需要在一个周期内完成。 25 | 26 | ## 本实验指导 27 | 28 | ### 整体架构 29 | 本实验整个项目工程的架构图如下: 30 | 31 | ![](./img/../../img/lab3/p1.png) 32 | 33 | 其中,做实验时只需要完成 myCPU 部分的代码即可,其他部分代码已补充完毕。在实现 myCPU 时需要将其最终的对外接口符合下面的接口定义。 34 | 35 | **关于数据存取:** 36 | 37 | MIPS 架构是一个统一编址的指令集架构,即没有 `IN`、 `OUT` 这类访问外设的指令。MIPS 架构是将地址空间中的一部分地址分配给 I/O 端口,这样在访问外设时跟访问数据存储器是相同的操作,即都是使用 LW、LW 这类访存指令来访问,因此读写外设和数据存储器是没有区别的。 38 | 39 | 因而上述架构图中会有一个 `bridge` 模块,该模块是用来确定读写的是数据存储器还是外设。该模块的工作原理就是通过地址来区分,本实验中,设定外设的地址空间是 **`0xbfaf_0000 ~ 0xbfaf_ffff`**,因此,当访存指令给出的访问地址是在该范围内时即说明要访问外设,`bridge` 会控制外设读写而不是数据存储器,反之亦然。 40 | 41 | ### 接口定义 42 | myCPU 模块对外接口如下: 43 | 44 | | 信号 | 方向 | 位宽 | 含义 | 45 | | - | - | - | - | 46 | | rstn | input | 1 | 复位信号(低使能) | 47 | | clk | input | 1 | 时钟信号 | 48 | | inst_rom_addr | output | 32 | 取指地址 | 49 | | inst_rom_rdata | input | 32 | 取到的指令 | 50 | | data_ram_addr | output | 32 | 访存地址 | 51 | | data_ram_wdata | output | 32 | 访存写数据 | 52 | | data_ram_wen | output | 1 | 访存写使能,置 1 为写使能 | 53 | | data_ram_rdata | input | 32 | 访存读数据 | 54 | 55 | 控制信号主要为 `rst` 和 `clk` 信号,其中一个提供低使能的复位信号,一个提供时钟信号以同步 CPU。 56 | 57 | 在取指这一部分有两个信号,`inst_rom_addr` 提供当前需要取出的指令的地址,这是一个 32 位的地址,而 `inst_rom_rdata` 是**同周期**内取回的指令数据,也是 32 位(MIPS 指令是定长指令,都是 32 位)。 58 | 59 | 在访存部分有如下几个信号,`data_ram_addr` 提供访存的地址,加载和存储指令复用该信号作为访存地址。`data_ram_wdata` 提供存储指令将要存储的数据,当访存指令为加载指令时该信号不起作用。`data_ram_wen` 在访存指令为存储指令时置高电平,表示将写存储器,其他情况置低电平。`data_ram_rdata` 是访存指令为加载指令时**同周期**返回的一个加载数据,即 LW 等指令从存储器中读取到的数据。 60 | 61 | 下图展示了 LUI, LW, SW 对接口使用情况的波形图。 62 | 63 | ![](../img/lab3/interface-example-wavedrom.svg) 64 | 65 | ### 数据通路 66 | 一个可参考的数据通路如下图所示: 67 | 68 | ![](../img/lab3/p2.png) 69 | 70 | 上图中黑色的线是数据信号线,红色的线是控制信号线,供 8 个控制信号。注:可将本文档同目录下的 [single_cycle.drawio](./single_cycle.drawio) 文件用 draw.io 网站打开,可编辑该图。 71 | 72 | 根据上图数据通路,浅析一条 LUI 指令的实现过程如下: 73 | 74 | - 首先,在时钟上升沿 `pc` 模块输出本条指令 pc 值,即指令的地址,通过该 pc 值可从指令存储器取出该 LUI 指令,本条指令会被译码,产生 op、funct 等信号 75 | - 控制模块根据输入产生相关的控制信号,对于 LUI 指令,`ext_sel` 控制信号会控制本条指令的 16 位立即数进行扩展(即 imm16 填充 32 位数据高 16 位,低 16 位补 0);`regfile_wdata_sel` 控制信号会控制最终写入寄存器堆的数据位 16 位立即数的扩展;`regfile_waddr_sel` 会控制寄存器写入地址位 `rt`;等等具体每个控制信号值如下表: 76 | 77 | |控制信号
指令|npc_sel|ext_sel|alu_B_sel|alu_ctrl|data_ram_wen|regfile_wen|regfile_waddr_sel|regfile_wdata_sel| 78 | |-|-|-|-|-|-|-|-|-| 79 | |LUI|00|10|1|3'b000|0|1|1|10| 80 | |ADD|00|00|0|ALU_ADD|0|1|0|00| 81 | |ORI|00|01|1|ALU_OR|0|1|1|00| 82 | |LW|00|00|1|ALU_ADD|0|1|1|01| 83 | |SW|00|00|1|ALU_ADD|1|0|0|00| 84 | |BEQ|10|00|0|ALU_SUB|0|0|0|00| 85 | |J|01|00|0|000|0|0|0|00| 86 | 87 | ``` 88 | 注: 89 | * npc_sel 为 00 指 pc 值顺序加 4,为 01 将直接跳转,为 10 将相对跳转 90 | * ext_sel 为 00 将对 16 位立即数进行符合扩展,为 01 进行零扩展,为 10 则将其置高 16 位 91 | * alu_B_sel 为 0 则选择 rt_rdata 作为 B 操作数,否则选择 16 位立即数的扩展结果作为 B 操作数 92 | * alu_ctrl 为 ALU_ADD 时指 alu 将进行加法操作,其他同理。为 000 不进行运算。具体 ALU_ADD 这些是宏定义,参考 defines.vh 查看具体定义值 93 | * data_ram_wen 为 1 则写数据寄存器 94 | * regfile_wen 为 1 则写寄存器堆 95 | * regfile_waddr_sel 为 1 则选择 rt 作为寄存器堆的写地址,否则 rs 作为写地址 96 | * regfile_wdata_sel 为 00 则 alu 运算结果作为寄存器堆写数据,为 01 时数据存储器的读数据作为写数据,为 10 时 16 位立即数的扩展结果作为写数据 97 | 98 | 上述赋值只是一个参考,可以根据情况自行修改,例如添加 AND 指令,alu_ctrl 就需要添加一个值来控制 alu 进行与操作。 99 | ``` 100 | 101 | - 在一个时钟上升沿时,`regfile` 模块根据输入的写数据,写地址即将数据写入寄存器堆。 102 | - 本条指令的执行并不使用到 `alu` 模块,但是 `alu` 模块内部还是会有相关执行,只是最终不使用它的执行结果罢了。 103 | 104 | ### 测试用例说明 105 | 测试用例包括两个,都是使用 MIPS 汇编编写,具体代码参看实验代码 [lab3](https://github.com/bit-mips/bitmips_experiments/tree/master/lab3) 下的 soft 目录。如果自己修改了汇编文件,需要使用该[链接](https://github.com/bit-mips/bitmips_experiments/tree/master/tools/coe_tool)下的 coe 生成工具,重新生成 coe 并例化在 DRAM 中。 106 | 107 | ``` 108 | - lab3 109 | - single_cycle 110 | - soft 111 | - adder8bit.S 8 bit 加法器的汇编实现 112 | - adder8bit.coe 汇编代码转换的 coe 文件 113 | - fibonacci.S 斐波拉契数列计算及显示的汇编实现 114 | - fibonacci.coe 汇编代码转换的 coe 文件 115 | ``` 116 | 117 | #### 8 bit 加法器 118 | 该汇编代码只使用到了本实验中实现的 7 条指令,代码功能如下: 119 | 120 | - 使用拨码开关作为两个加数的输入,8 个拨码开关可以生成一个 8 bit 的数(每位拨上为 1,拨下为 0) 121 | - 调整好拨码开关后,按下 `UP` 按钮则此时拨码开关状态转换的数作为第一个加数,按 `RIGHT` 按钮则此时拨码开关状态转换的数作为第二个加数。按下 `MID` 按钮则计算出两个加数相加的结果并在数码管显示 122 | - 一次计算的结果会赋值给第一个加数 123 | 124 | #### 斐波拉契数列计算及显示 125 | 该汇编代码只使用到了本实验中实现的 7 条指令,代码功能如下: 126 | 127 | - 该汇编代码会计算斐波拉契的前 22 项,其中第 1 项和第 2 项都是 1,需要计算得到的是第 3 项到 22 项,即 2,3,5,... 17711,并将这 20 项存储到数据存储器 128 | - 最后程序会再从数据存储器取出数据,并将数据逐个通过数码管显示 129 | 130 | **关于数据存储器** 131 | 132 | 在本实验中数据存储器的大小是 4K Byte,即实际的物理空间所占用的地址只有 `0x000 ~ 0xfff`,但是 MIPS 的地址空间是 `0x00000000 ~ 0xffffffff`,因此需要将虚拟地址往物理地址映射,本实验是采用线性映射的方式,即虚拟地址 `0xaaaaaxxx` 会被映射到物理地址 `0x00000xxx`。 133 | 134 | 斐波拉契数列计算的实验代码中使用到了一个 `0xbfc1_0000` 作为存储斐波拉契数列的首地址,该地址即是一个虚拟地址,通过映射该地址为 `0x000`,即第一项将存储在数据存储器的第一个字的位置。 135 | 136 | > 实际上`0xbfc1_0000`只是为了便于大家理解线性映射的概念,这里如果把`0xbfc1_0000`改成`0xbfc2_0000`程序运行结果也是一样的 137 | 138 | -------------------------------------------------------------------------------- /lab5/introduction.md: -------------------------------------------------------------------------------- 1 | # MIPS CPU 简单流水线设计 2 | 3 | **如果你当前的 CPU 架构中实现访存是没有延迟的,那么你可以直接使用 lab3 进行测试。然后再考虑修改架构以适应 lab5。** 4 | 5 | ## 实验要求 6 | 7 | ### 你需要自己完成的部分 8 | 9 | 设计并实现一个 MIPS 指令集流水线 CPU,例如经典的五级流水线。 10 | 11 | ### 本 lab 能提供给你的部分 12 | 13 | 本 lab 提供了一个适用于精工开发板的 SOC,并提供了可仿真、可下板的环境。 14 | 15 | ## 这个 lab 如何帮助你? 16 | 17 | 在看到这里的时候,你应该正在计划或者已经实现了一个 MIPS 流水线 CPU。 18 | 19 | 但是如果没有针对外设写相应的代码,此时你的 CPU 只能读取运行测试代码,而暂且无法访问外部设备。同时,也只能通过查看仿真波形来调试。 20 | 21 | **本 lab 中提供的 SOC 能够帮助你在不需要了解硬件标准的情况下,完成精工开发板的设备访问。同时程序提供了一个自动对比的一系列测试用例(可仿真或下板)。** 22 | 23 | 用白话来说就是:写好 CPU 软件部分后,只需要修改一下接口,就可以在仿真环境自动对每个指令运行结果进行对比;并在下板环境跑相关指令的测试用例,并从数码管打印出结果。 24 | 25 | 26 | ## 实验内容 27 | 28 | 本实验需要实现一个 MIPS 指令集架构的流水线 CPU,能够完成 23 条简单指令的实现,之后能够自行再添加指令。(本实验中不考虑异常处理,仅实现指令的基本功能) 29 | 30 | 本实验的实验代码在对应的代码仓库 lab5,实验代码中,已经搭建好了一个基本的 SOC 环境,同时也编写了一套对应的测试代码。做实验时,只需关注基本的流水线 CPU 的设计,而不用去关注除 CPU 的外部环境和测试代码的编写。最终,在通过仿真测试之后也能进行下板操作,下板之后可以看到相应的效果。 31 | 32 | 在进行实验之前请先阅读相关文档,对本实验的实验代码结构有一定的了解,对一些基本概念有一个认识,之后再根据实验步骤完成相应模块的代码编写。 33 | 34 | 运行下板测试程序需要实现的指令如下: 35 | 36 | - `add` 37 | - `addu` 38 | - `addi` 39 | - `addiu` 40 | - `sub` 41 | - `subu` 42 | - `slt` 43 | - `sltu` 44 | - `or` 45 | - `ori` 46 | - `xor` 47 | - `xori` 48 | - `lui` 49 | - `sll` 50 | - `srl` 51 | - `sw` 52 | - `lw` 53 | - `beq` 54 | - `bne` 55 | - `j` 56 | - `jal` 57 | - `jr` 58 | 59 | ## SOC 使用步骤 60 | 61 | ### 下载项目 62 | 63 | ```bash 64 | git clone https://github.com/bit-mips/bitmips_experiments.git 65 | ``` 66 | 67 | ### 使用 Vivado 打开项目 68 | 69 | 点击 `Open Project`,选中 `bitmips_experiments/lab5/teach_soc/teach_soc.xpr` 进入项目。 70 | 71 | ### 添加你的 CPU 项目 72 | 73 | **注意,首先你需要按照[流水线 CPU 顶层接口规范](./soc-interface.md)修改自己的 CPU 的接口,适配 SOC。** 74 | 75 | 在主面板 `Project Manager > Source` 中点击 `+`,并将满足接口要求的 CPU 文件夹添加到项目中。 76 | 77 | *截图沿用 lab3 实验截图* 78 | ![](../img/lab3/2020-09-09-lab3-vivado-add-directory.png) 79 | 80 | 作为验证,确保 `Source` 面板中 `teach_soc_top` 下有你的 CPU 实现文件。 81 | 82 | ![](../img/lab5/2020-09-18-verify-vivado-hdl-source.png) 83 | 84 | ### 仿真环境运行自动对比 85 | 86 | **该对比测试会对执行的(几乎)每条指令进行测试,比下板测试更加方便且精确。** 87 | 88 | 直接点击 `Run Simulation` 89 | 90 | 然后运行并观察下方 `Tcl Console` 打印内容。 91 | 92 | ![](../img/lab5/2020-09-22-trace-running.png) 93 | 94 | #### 🎉 仿真环境通过全部测试 95 | 96 | ![](../img/lab5/2020-09-22-trace-success.png) 97 | 98 | #### 🙃 未通过测试 99 | 100 | ![](../img/lab5/2020-09-22-trace-error.png) 101 | 102 | 当运行信号和测试用例有不一致的情况时,仿真会自动停止在错误处,并打印对比信息。 103 | 104 | 在上图中我们能看到测试文件对比了 PC 、回写的寄存器编号与地址。通过这些信息,你可以进行问题排查。 105 | 同时,也可以通过停止时已经生成的波形信号进行问题查找。 106 | 107 | ### 下板跑测试用例 108 | 109 | 直接点击 `Generate Bitstream` 生成比特流。 110 | 111 | 完成后,连接精工开发到电脑,并且选择 `Open Hardware Manager`。在打开的界面上方点击 `Auto Connect`,连接硬件设备: 112 | 113 | ![](../img/lab5/2020-09-18-hardware-connected.png) 114 | 115 | 然后选择 `Program device`, `Program`。 116 | 117 | 此时,程序已经写入开发板。 118 | 119 | 此时将所有拨码开关上拨 + 最右侧两个拨码开关下拨可以更好的看到数码管变化。 120 | **(下方八个拨码开关其实对应着一个二进制数,代表测试用例之间运行的间隔。都拨上时,这个间隔最小;都拨下时,这个间隔最大)** 121 | 122 | 正常情况下,当程序写入完成瞬间,数码管左右两侧会出现十六进制数字,从 0 一直加到 13(代表 0x13 个测试点,每个测试点针对一个指令进行多条测试)。 123 | 124 | 左侧数字表示已经执行完的测试。右侧数字表示通过的测试。 125 | 126 | 因此如果左右两侧数字不一致,则代表有测试点没有通过。 127 | 128 | **如果左右两侧数字一致,则代表测试点全部通过。** 129 | 130 | ![](../img/lab5/2020-09-18-hardware-run.png) 131 | 132 | -------------------------------------------------------------------------------- /lab5/soc-interface.md: -------------------------------------------------------------------------------- 1 | # 流水线 CPU SOC 接口规范 2 | 3 | **如果你当前的 CPU 架构中实现访存是没有延迟的,那么你可以直接使用 lab3 进行测试。然后再考虑修改架构以适应 lab5。** 4 | 5 | ### 整体架构 6 | 本实验整个项目工程的架构图如下: 7 | 8 | ![](./img/../../img/lab3/p1.png) 9 | 10 | 其中,做实验时只需要完成 myCPU 部分的代码即可,其他部分代码已补充完毕。在实现 myCPU 时需要将其最终的对外接口符合下面的接口定义。 11 | 12 | **关于数据存取:** 13 | 14 | MIPS 架构是一个统一编址的指令集架构,即没有 `IN`、 `OUT` 这类访问外设的指令。MIPS 架构是将地址空间中的一部分地址分配给 I/O 端口,这样在访问外设时跟访问数据存储器是相同的操作,即都是使用 LW、LW 这类访存指令来访问,因此读写外设和数据存储器是没有区别的。 15 | 16 | 因而上述架构图中会有一个 `bridge` 模块,该模块是用来确定读写的是数据存储器还是外设。该模块的工作原理就是通过地址来区分,本实验中,设定外设的地址空间是 **`0xbfaf_0000 ~ 0xbfaf_ffff`**,因此,当访存指令给出的访问地址是在该范围内时即说明要访问外设,`bridge` 会控制外设读写而不是数据存储器,反之亦然。 17 | 18 | 19 | ## 对 CPU 进行修改 20 | 21 | 1. 修改顶层模块接口并对接接口时序 22 | 2. 修改内存映射 23 | 3. 修改 `PC` 初始化地址 24 | 25 | ### 接口定义 26 | 27 | myCPU 模块对外接口如下: 28 | 29 | | 信号 | 方向 | 位宽 | 含义 | 30 | | - | - | - | - | 31 | | resetn | input | 1 | 复位信号(低使能) | 32 | | clk | input | 1 | 时钟信号 | 33 | | int | input | 6 | 中断信号(高使能,本实验中可以忽略) | 34 | | | | | | 35 | | inst_sram_en | output | 1 | 指令通道使能 | 36 | | inst_sram_wen | output | 4 | 是否写数据(总为 `4'b0000`) | 37 | | inst_sram_addr | output | 32 | 指令地址 | 38 | | inst_sram_wdata | output | 32 | 写入的数据(不需要) | 39 | | inst_sram_rdata | input | 32 | 读取的指令 | 40 | | | | | | 41 | | data_sram_en | output | 1 | 数据通道使能 | 42 | | data_sram_wen | output | 4 | 写入地址的有效字节,比如 `4'b1111` 表示 32 位全有效、 `4'b0001` 只会写入最低 8 位 | 43 | | data_sram_addr | output | 32 | 数据地址 | 44 | | data_sram_wdata | output | 32 | 写入的数据(只有 data_sram_wen 为 1 时有意义) | 45 | | data_sram_rdata | input | 32 | 读取的数据 | 46 | | | | | | 47 | | debug_wb_pc | output | 32 | 写回级(多周期最后一级)的 PC,因而需要在你的 CPU 里将 PC 一路带到写回级 | 48 | | debug_wb_rf_wen | output | 4 | 写回级写寄存器堆(regfiles)的写使能,为字节写使能,如果 mycpu 写 regfiles 为单字节写使能,则将写使能扩展成 4 位即可。 | 49 | | debug_wb_rf_wnum | output | 5 | 写回级写 regfiles 的目的寄存器号 | 50 | | debug_wb_rf_wdata | output | 32 | 写回级写 regfiles 的写数据 | 51 | 52 | 控制信号主要为 `rst` 和 `clk` 信号,其中一个提供低使能的复位信号,一个提供时钟信号以同步 CPU。 53 | 54 | 在取指这一部分有三个主要信号,`inst_sram_en` 作为使能,控制 sram 是否读取指令。 `inst_sram_addr` 提供当前需要取出的指令的地址,这是一个 32 位的地址,而 `inst_sram_rdata` 是**有一周期延迟**下取回的指令数据,也是 32 位(MIPS 指令是定长指令,都是 32 位)。 55 | 56 | 在访存部分有如下几个信号,`data_sram_en` 作为使能,控制 sram 是否读取或写入数据。 `data_sram_addr` 提供访存的地址,加载和存储指令复用该信号作为访存地址。`data_sram_wdata` 提供存储指令将要存储的数据,当访存指令为加载指令时该信号不起作用。`data_sram_wen` 在访存指令为存储指令时置高电平,表示将写存储器,其他情况置低电平。`data_sram_rdata` 是访存指令为加载指令时**延迟一个周期**返回的一个加载数据,即 LW 等指令从存储器中读取到的数据。 57 | 58 | 最后四个信号(以 `debug_` 开头)是用于仿真环境的自动对比测试使用,它不需要你额外增加 CPU 功能,只需要将内部信号牵引出来(注意是回写级)。 59 | 60 | 下图分别展示了取指,读取数据,写入数据对相应接口的操作(**注意图与图之间并没有关联,本图只是表达同一组接口的信号的延迟情况**): 61 | 62 | ![](../img/lab5/read_inst.svg) 63 | 64 | ![](../img/lab5/read_data.svg) 65 | 66 | ![](../img/lab5/write_data.svg) 67 | 68 | 在写内存时,因为没有需要接收的返回的信号,所以图中的只有一个周期画出了信号。**写入内存时,不需要暂停流水线。** 69 | 70 | ### 修改内存映射 71 | 72 | #### TL;DR 73 | 74 | 在数据和指令地址送出之前,把最终的地址高三位抹 0 就行。 75 | 76 | ``` 77 | // e.g. 78 | 0xbfc0_0000 -> 0x1fc0_0000 79 | ``` 80 | 81 | 82 | #### 更多解释 83 | 84 | 如果你阅读了 `bridge_1x2.v`(用于判定访存是走的外设还是数据存储器) 的代码,你会发现如下定义: 85 | 86 | ```verilog 87 | `define CONF_ADDR_BASE 32'h1faf_0000 88 | `define CONF_ADDR_MASK 32'hffff_0000 89 | 90 | // ... 91 | 92 | assign sel_conf = (cpu_data_addr & `CONF_ADDR_MASK) == `CONF_ADDR_BASE; 93 | 94 | // ... 95 | 96 | always @ (posedge clk) begin 97 | if (reset) begin 98 | sel_sram_r <= 1'b0; 99 | sel_conf_r <= 1'b0; 100 | end else begin 101 | sel_sram_r <= sel_sram; 102 | sel_conf_r <= sel_conf; 103 | end 104 | end 105 | 106 | assign cpu_data_rdata = {32{sel_sram_r}} & data_sram_rdata 107 | | {32{sel_conf_r}} & confreg_rdata; 108 | ``` 109 | 110 | 111 | 为什么用于比较的 `CONF_ADDR_BASE` 不是 `0xbfaf_0000` 而是 `0x1faf_0000`。 112 | 113 | 原因在于 MIPS 规范中的内存地址映射。 114 | 115 | ![](../img/lab5/2020-09-22-seg-map.png) 116 | ![](../img/lab5/2020-09-22-seg-map-zh.png) 117 | 118 | 以上两图中的虚拟地址是 CPU 内部的地址,而物理地址是送出顶层模块的地址。 119 | 120 | 本 SOC 遵守 MIPS 规范考虑到了地址映射,因此 CPU 编写者也需要注意进行转换。 121 | 122 | ### 修改 `PC` 初始化地址为 `0xbfc0_0000` 123 | 124 | 也就是当 `resetn` 使能的时候, `PC` 回到 `0xbfc0_0000` 而不是 `0x0000_0000`。 125 | -------------------------------------------------------------------------------- /lab7/cache.md: -------------------------------------------------------------------------------- 1 | # Cache 设计实验指导 2 | 3 | **注:1. 本实验目前只针对参加龙芯杯的同学设定,未来可能会设计一个课堂版本。2. 同时本实验只包含一个说明文档,不包括代码,参加龙芯杯的同学可以根据自己当前设计的 CPU 架构合理的加入一个 Cache 能提高性能即可。3. 做本实验之前请完成龙芯杯初赛的内容。4. 结合龙芯杯文档 A14 来看。5. 以下内容只是往届的一个经验总结,可能有地方表述的并不准确,请多包涵。如有错误也希望能够提 issue 告知我们。** 4 | 5 | ## 类 SRAM 协议与 AXI 协议简介 6 | 7 | 龙芯杯初赛内容要求是完成一个 57 条指令的 CPU(包含部分异常处理功能) 并且能通过官方给的测试用例,在这个阶段,参赛队伍实现的 CPU 需要使用 SRAM 接口或者 AXI 接口进行封装。关于 SRAM 接口此处不再赘述。 8 | 9 | 如果要对实现的 CPU 进行性能测试,那么必需实现 AXI 接口。 10 | 11 | 一般,如果实现的是 SRAM 接口,那么将改接口转为 AXI 接口也是比较简单的,需要以类 SRAM 协议作为桥梁来转换(或将原 CPU 接口直接设计为类 SRAM 接口),下面简要介绍类 SRAM 接口和 AXI 接口。 12 | 13 | > 其实在官方文档(A12)里是有对 SRAM 介绍的,AXI 的介绍可以去看 AMBA 总线文档。下面内容只是对重点进行的一个重复说明。 14 | 15 | 16 | ### 类 SRAM 协议 17 | 可以知道,SRAM 接口是没有握手协议的,所以当 CPU 向外发出访存信号时,读取的数据的频率需要与 CPU 的频率同步,进而会限制 CPU 频率(访存操作是一个相对耗时的过程)。而类 SRAM 增加了握手信号,这样就可以根据握手信号来进行同步,读取的数据可以在任意周期内返回。由于在 `SoC_SRAM_Lite` 中使用的存储器是 BRAM 构建的,而 BRAM 读取是由一个固定周期的延时,因此相对比较好处理。 18 | 19 | 此处着重说明 `addr_ok` 和 `data_ok` 两个信号: 20 | 21 | |信号|位宽|方向|说明| 22 | -|-|-|- 23 | addr_ok|1|slave—>master|当该信号为 1 时,表明 slave 已接受到 master 发出的请求,即读数据时指读地址已被接收,写数据时指写地址和写数据已被接收。 24 | data_ok|1|slave—>master|当该信号为 1 时,表明本次数据传输完成,即读数据时指当前的 rdata 通道就是读取的数据,写数据是表明写数据操作已完成。 25 | 26 | 一次读数据时序解析: 27 | 28 | 29 | 30 | 一次写数据时序解析: 31 | 32 | 33 | 34 | 35 | **关于 SRAM 转类 SRAM 接口**:一般,如果原来 CPU 接口是 SRAM 接口,需要写额外的程序将 SRAM 接口转为类 SRAM 接口。这一部分可以使用状态机来完成。那么同时需要在 SRAM 接口中增加暂停控制信号,因为数据读写时间延迟是不固定的,虽然类 SRAM 可以通过握手信号来同步,但是内部 CPU 是 SRAM 接口没有握手信号,需要添加暂停信号来控制流水,已达到同步的目的。(其实可以直接将 CPU 的出口设计为类 SRAM 接口也是可以的) 36 | 37 | ### AXI 协议 38 | 在 AMBA 总线协议中有对 AXI 协议的详细介绍,在龙芯官方的 SOC 上使用的是 AXI4 Lite 是一个 AXI 的简化版本,省去了一些不必要的接口信号。 39 | 40 | AXI 协议分为读通道和写通道,读通道有两组信号(读地址通道信号,读数据通道信号),写通道有三组信号(写地址通道信号,写数据通道信号,写响应通道信号)。 41 | 42 | 读通道: 43 | - 读地址通道信号:主要是由 master 发出读请求,包含读取的地址、握手相关的信号。 44 | - 读数据通道信号:主要是由 slave 发出读响应,即向 master 发送读取到的数据,包含读取的数据、握手相关信号。 45 | 46 | 写通道: 47 | - 写地址通道信号:主要是由 master 发出写请求,包含写的地址、握手相关的信号。 48 | - 写数据通道信号:主要是由 master 发出的写数据,包含要写的数据、握手相关信号。 49 | - 写响应通道信号:主要是由 slave 发出的写恢复信号,指明写操作完成,包含相关握手信号。 50 | 51 | 当 CPU 完成类 SRAM 接口之后,可以使用龙芯官方提提供的 `cpu_axi_interface.v` 转换接口来将类 SRAM 转换为 AXI 接口,但是这个转换接口效率较低,并且不支持 burst 传输,如果要使用 Cache 那么必须需要支持 burst 传输。 52 | 53 | AXI 不细说,涉及的信号比较多,看一下 AMBA 协议手册是比较容易懂的。 54 | 55 | ## 实验指导 56 | 57 | 本章节不对 Cache 原理进行介绍,关于 Cache 原理可以参考计算机体系结构等书籍了解。在实现 Cache 之前,请对 AXI 协议进行充分的了解。 58 | 59 | ### Cache 属性 60 | 61 | 查看官方文档 A12 或 MIPS 手册。 62 | 63 | ### 可参考的两个 Cache 架构 64 | 65 | 如果不实现 Cache,将CPU 封装为 AXI 接口,使用龙芯性能测试用例来进行性能测试时,所得到的性能分数是比较低的,如果实现了 Cache,那么 CPU 性能分数可以显著的得到提升。因此,如果希望进入决赛,那么必须要实现 Cache,并且 Cache 的性能还必须达到一定的高度。 66 | 67 | CPU 与 Cache 的联通方式可以有不同的架构,下面介绍两种基本架构仅供参考。如图: 68 | 69 | ![](../img/lab7/p3.png) 70 | 71 | **架构1**: 72 | 在架构一中,从 CPU 中出来的数据请求包括两类,一类是 Uncached 的,一类是 Cached 的。对于 Uncached 类数据请求,数据不能通过 Cache 缓存,也就是说需要直接对存储器或外设进行访问,这是可以理解的,比如访问外设数据,一般读写外设是需要实时的操作,如果将要写入的数据放到缓存,那么外设就不能及时得到数据。架构 1 的想法就是将 Uncached 和 Cached 两类数据请求分开,如果不需要 Cache 缓存,那么就直接访问外设和数据存储器。需要 Cache 缓存的就再通过缓存。这样最终会有 4 个 slaver(cached inst bus,cache data bus,uncached inst bus,uncached data bus),通过一个 AXI cross bar IP 的作用可转换成一个 AXI 接口,最终给接到龙芯 AXI SOC。 73 | 74 | **架构2**: 75 | 相比于架构 1,架构 2 是将所有的请求都通过 Cache,即 Cache 内部状态机根据数据请求是 Uncached 还是 Cache 的来自动的进行缓存。数据请求是 Uncached 时,Cache 仅充当一个“桥梁”作用,不起到缓存的作用,只有数据请求是 Cached 时才起到缓存的作用。在这种架构下,CPU core 的接口需要提供一个信号指明本次数据请求是 Cached 还是 Uncached。 76 | 77 | ### 实现细节 78 | 79 | 具体实现要能把握一下几个要点: 80 | 81 | #### 1. Cache 性能 82 | 83 | 对于 Cache 的实现,不同的实现具有不同的性能,这个性能具体体现在当 Cache 命中时数据返回所需要花费的周期的多少。也就是说,在最理想的情况下,当 Cache 命中时是不可以阻塞流水线的流动的,数据仿佛是在发出读写信号时就立即返回了。而 Cache 内部的命中时间花费需要由 Cache 内部自动消化,对于单发射的 CPU 此时的 CPI = 1。 84 | 85 | 一般,要想使 Cache 命中时 CPI = 1,这需要 CPU core 和 Cache 能够良好的交互,需要有一个比较高效的总线,有时可能会导致 CPU 与 Cache 耦合较为紧密。 86 | 87 | #### 2. 使用 BRAM 搭建 Cache 88 | 89 | 一些队伍在实现 Cache 时可能会使用 Reg 变量直接搭建(或使用 DRAM,最终也是转换为 Reg),这时如果设计的 Cache 比较大那么会耗费较多的 LUT 资源,并且综合实现过程会极度缓慢。官方建议是使用 Block Memory Generator IP 来搭建。 90 | 91 | 使用 BRAM 进行搭建时会有一个问题,就是 BRAM 读写数据时会有一个时钟周期的延时。这将使得 Cache 即使命中读写也会至少有一个周期的的延时。这时可能需要使用流水线来消耗这个周期。一种解决方式如下: 92 | 93 | ![](../img/lab7/p4.png) 94 | 95 | 对于指令来说,在取值阶段发出取值请求,此时不等待数据返回,流水线继续流动一个周期,而此时如果 Cache 命中,那么下个周期就可以得到数据(前提是 Cache 设计合理)。到译码阶段时,Cache 将命中数据返回,然后数据即指令参与到译码。如果 Cache 未命中,此时可以再让流水线暂停。这样就可以让流水线消耗掉 BRAM 由于读写延时产生的一个周期延时。对于数据存取可以采用同样的方式,在访存阶段发出读写请求,然后流水线继续流动,在回写阶段根据 Cache 是否命中选择是否暂停流水线。 96 | 97 | #### 3. Cache 内部的状态机设计 98 | 99 | Cache 内部需要有一个状态机来协调工作,一方面需要顾及 Cache,一方面也需要顾及接口。我们已上文的架构 2 来讨论一个状态机的设计。下图,是一个数据 Cache 的内部状态机的示意图: 100 | 101 | ![](../img/lab7/p5.png) 102 | 103 | 首先,这个状态机看起来比较复杂是因为为了能够详细表述每个阶段,我把所有状态全部拆分出来了,实际上在实现的过程中可以考虑一些状态的合并。我们来举两个例子分享。 104 | 105 | - 以一次数据写请求为例(过 Cache): 106 | - 首先 CPU 发出一个数据写请求,同时表示这是需要经过 Cache 的,状态机查表,看是否 hit,如果 hit,下个周期即可写入 Cache,进入 `data_ready` 状态(该状态为一次读写请求做最后处理,如修改 `dirty` 值等);如果没有 hit,下个周期进入 miss 处理阶段。 107 | - 根据替换算法,如果被替换空间的 `dirty` 标记为 1,那么就需要先将该区域的值写回到内存,即需要经过 `miss_write` 等若干阶段;否则,那么就可以直接将要写的数据读取到内存,然后将相应位置的数据进行更新,之后进入最后的 `data_ready` 阶段。 108 | - 以一次数据读请求为例(不过 Cache): 109 | - 不经过 Cache 时处理相对简单,直接根据 AXI 协议来进行处理,通过握手信号确定状态的改变,最终读取到信号后进入 `data_ready` 阶段。 110 | 111 | #### 4. 关于 Cache 的大小设计 112 | 113 | 龙芯官方给出的建议如下表: 114 | 115 | |属性|Inst Cache|Data Cache| 116 | |-|-|-| 117 | |大小|8 KB|8 KB| 118 | |way 数|2 way|2 way| 119 | |bank 数|8|8| 120 | |Byte/bank|4 Byte| 4 Byte| 121 | |深度|128 set|128 set| 122 | 123 | 由上可知,指令 Cache 和数据 Cache 的大小是相同的都是 ,在实际实现的时候可以考虑设计为 4 路组相联,尤其数指令 Cache 设计为 4 路组相联性能会提升相对较多。bank 数也可由 8,改为16,这样每次 burst 可以传输更多的数据。 124 | 125 | 以上的这些是只考虑了单独的数据存储所花费的空间,在实际实现中还会有 `tag`,`dirty` 这些属性以及实现替换算法会花费一部分存储资源。 126 | 127 | #### 5. 关于替换算法 128 | 129 | 目前来说替换算法肯定是要实现 LRU 算法的,如果是 2 路组相联,每一行只需要 1 位数据即可,即上述的 Cache 需要 的存储资源用于实现替换算法。如果是 4 路组相联,那么需要的存储资源也会更多,同时实现起来也会更复杂。毕竟,对于 2 路组相联,当访问其中一路时,那么这一路就是最近访问的,另外一路就会被替换,这样就可以使用 1 bit 数据就可以表示哪一路数据要被替换掉。 130 | 131 | 替换算法其实也是可以进行改进的,除了 LRU 算法以外还有一些其他的替换算法,也可以看一些文献,将一些最新的科研成果加入到设计之中。 132 | 133 | **参考:** 134 | 1. 龙芯杯官方文档 135 | 2. AMBA 协议手册 -------------------------------------------------------------------------------- /lab7/introduction.md: -------------------------------------------------------------------------------- 1 | # Cache 设计 2 | 3 | 本实验将指导设计并实现一个简单的 2 路组相连的 Cache。 4 | 5 | ## 实验要求 6 | - 能够对 Cache 的原理、设计与实现有一定的了解 7 | - 能够认识到 Cache 对提高 CPU 性能的重要意义 8 | 9 | 10 | ## 实验内容 11 | 本实验将指导逐步完成一个简单 Cache 的实现,这个 Cache 是一个 2 路组相联的 Cache,其中会使用到 LRU 替换算法。在完成本实验之前请确保对 Cache 的原理有所了解(本实验文档不会详细介绍 Cache 的原理),本实验指导不包含代码,仅有一些讲解。同时本实验指导还会涉及到一些接口协议的介绍,主要包括 Cache 与 CPU 之间的接口协议(类 SRAM 协议),Cache 与外部环境的接口协议(AXI 协议)。 12 | 13 | [Cache 实验指导](./cache.md) 14 | 15 | [一个 Cache 数据块组织框架(供参考)](https://github.com/bit-mips/bitmips_experiments/tree/master/lab7/cache%20demo) 16 | 17 | -------------------------------------------------------------------------------- /others/cross_compiler.md: -------------------------------------------------------------------------------- 1 | # 交叉编译工具链安装及使用 2 | 3 | ## 安装步骤 4 | 5 | 1. 首先主机需要有 Linux 环境,可以是双系统也可以是虚拟机。Linux 环境建议使用 Ubuntu16.04,目前来说在 Ubuntu16.04 下使用还没有出现较大的问题,网上有些博客说 Ubuntu18.04 可能会有问题。 6 | - 注:不要使用 wsl,要安装的交叉编译工具链是32位程序,而 wsl 目前只支持运行64位程序。 7 | - 注:关于 wsl 运行 32 位程序可以查看如下[链接](https://github.com/microsoft/WSL/issues/2468)。 8 | 9 | 2. 在 linux 命令行下,然后使用如下命令下载 10 | ``` 11 | wget http://ftp.loongnix.org/toolchain/gcc/release/gcc-4.3-ls232.tar.gz 12 | ``` 13 | 14 | 3. 解压 15 | ``` 16 | sudo tar -zxvf gcc-4.3-ls232.tar.gz -C / 17 | ``` 18 | 19 | 4. 设置环境变量 PATH 20 | ``` 21 | echo "export PATH=/opt/gcc-4.3-ls232/bin:$PATH" >> ~/.bashrc 22 | source ~/.bashrc 23 | ``` 24 | 25 | 如果机器是64位的机器还需执行如下命令 26 | ``` 27 | sudo apt-get install lsb-core 28 | ``` 29 | 30 | 完成上述工作后,可以输入 `mipsel-linux-gcc -v`,如果可以看到有版本号输出,说明配置正确。 31 | 32 | ## 使用 33 | 34 | 使用方式同 gcc,可以结合 [coe](https://github.com/bit-mips/bitmips_experiments/tree/master/tools/coe%20tool) 工具使用。 35 | 36 | ## 关于指令生成 37 | 38 | 初期在对 CPU 进行测试时会写一些指令来测试 CPU 的正确性。指令的生成方式有很多,如下介绍几种方式: 39 | 40 | - 根据指令集手册来手动编写 41 | - 这是一种较为“低级”的方式,但却又行之有效。在对交叉编译工具链等软件不熟悉的情况下,这种方式快速写出若干条指令,用以检测 CPU 的某些功能。 42 | - 示例:lui 指令的编码规则为`op`字段固定为 `001111`,`rs`字段固定为`00000`,`rt`字段为目标寄存器地址,bit 15~0 为16位的立即数,那么想要将数据`0xbfc0_0000`加载到寄存器 `$8`则可编写如下指令(小端) 43 | ``` 44 | Bin 00111100 00001000 10111111 11000000 45 | Hex 3c08bfc0 46 | ``` 47 | - 通过一些脚本语言辅助编写 48 | - 上述的方式很简单,在编写几条指令时行之有效,但是需要批量的指令,且指令单一(仅若干比特位不同)时就不太奏效。此时可以使用 python 等脚本语言编写。 49 | - 示例: 50 | ``` 51 | # rt 为整数,imm16 为 16 进制字符串且格式为 0x** 52 | def lui_gen(rt, imm16): 53 | return "001111" + "00000" + '{:05b}'.format(rt) + '{:016b}'.format(int(imm16, 16)) 54 | 55 | print(lui_gen(8, '0xbfc0')) # 00111100000010001011111111000000 56 | ``` 57 | 58 | - 通过 [Mars](http://courses.missouristate.edu/kenvollmar/mars/) 等软件来生成 59 | - Mars 是一个可执行 jar 包,运行之后可以在其编辑区域编写 MIPS 汇编代码,之后可以利用该软件来生成相应的指令的16进制编码。 60 | - 在 Mars 主界面的编辑区域编辑汇编代码,点击工具栏 `Run -> Assemble` 61 | 62 | ![](../img/others/p3.png) 63 | 64 | - 之后出现如下界面,可以看到 Mars 将汇编代码进行了“翻译” 65 | 66 | ![](../img/others/p4.png) 67 | 68 | - 点击上图中红色方框的内的按钮来将指令编码保存下来,`Memory Segment` 可以选择是保存数据段还是指令段代码,`Dump Format` 选择保存格式,一般选择保存十六进制编码格式。 69 | 70 | ![](../img/others/p5.png) 71 | 72 | - 通过交叉编译工具链来生成 73 | - 当使用交叉编译工具链时,指令码的生成就尤其灵活,由于交叉编译工具链及其强大,可以先编写汇编或 C 代码,然后经工具编译及相关操作,最后生成指令编码。通常使用过程中可配合 makefile 和链接脚本使用。下面介绍通过汇编代码和 [coe](https://github.com/bit-mips/bitmips_experiments/tree/master/tools/coe%20tool) 工具生成指令编码。 74 | - 一般,我们会将汇编代码转换为 coe 格式文件,之后将 coe 文件加载至 IP 核使用。关于 coe 文件介绍见本文最后。coe 文件的内容即是一系列的指令编码构成。通过 coe 工具可以很方便生成。 75 | - 该 coe 工具使用介绍如下: 76 | - 安装龙芯杯大赛提供的交叉编译工具链 77 | - 将上述压缩包在 linux 环境下解压 78 | - 进入该 `coe_file` 目录 79 | - 编辑 inst_rom.S 80 | 81 | ![](../img/others/p1.jpg) 82 | 83 | - 编辑完汇编代码之后,在该目录执行 make 命令,无报错则编译成功 84 | 85 | ![](../img/others/p2.jpg) 86 | 87 | - 查看同目录下的 `inst_rom.coe` 文件即为生成文件,包含所需指令。 88 | - 若出现 `./bin2coe.py: Permission denied` 错误使用如下命令解决 89 | ``` 90 | chmod u+x bin2coe.py 91 | ``` 92 | 93 | ## coe 文件说明 94 | coe 格式文件就是一个具有特定格式的文本文件,主要用来为 IP 核初始化数据,一般可以使用 coe 格式文件来加载指令或数据。它的文本格式如下: 95 | ``` 96 | memory_initialization_radix=16; 97 | memory_initialization_vector= 98 | 3C08BFC0, 99 | 00000000, 100 | 00000000, 101 | 00000000, 102 | 00000100, 103 | 00000000, 104 | 00000000, 105 | 00000000, 106 | 00000000, 107 | 00000000, 108 | 01200000, 109 | 05000101, 110 | 00000000, 111 | 00000000, 112 | 00000000, 113 | 00000000; 114 | ``` 115 | - memory_initialization_radix 指明数据使用的进制 116 | - memory_initialization_vector 指明具体数据,其 "=" 后就是一条条指令十六进制编码了,如果你观察仔细可以发现第一条指令编码是 `3C08BFC0` 即代表指令 `lui $t0, 0xbfc0` 117 | 118 | 如果你不使用 IP 核加载数据,而是使用 `$readmemh()` 等函数来将数据加载至寄存器堆构造的指令或数据存储器,可以将 coe 格式文件稍加修改即可使用(或者写个脚本也很方便)。 119 | 120 | -------------------------------------------------------------------------------- /others/install.md: -------------------------------------------------------------------------------- 1 | # Vivado 下载及安装 2 | 3 | ## 下载 4 | 5 | 这里以 Vivado 2018.3 为例,介绍在 Windows 10 上的下载及安装过程。 6 | 7 | - 在 [Xilinx](https://www.xilinx.com/) 官网注册一个账号,相关信息尽量填全。 8 | - 进入[下载页面](https://www.xilinx.com/support/download.html),选择一个需要的版本 9 | 10 | 11 | 12 | - Vivado 可以下载离线安装版本和在线安装版本,**强烈建议下载在线安装版本,然后在线下载安装**。即选择如下的 `WebPack` 版本。 13 | 14 | 15 | 16 | - 下载至本地,双击开始在线安装。 17 | 18 | ## 安装 19 | 20 | - 首先需要用户验证,输入自己的 Xilinx 账号和密码,然后选择 `Download and Install Now` 21 | 22 | 23 | 24 | - Accept License,全部 Agree 25 | 26 | 27 | 28 | - 选择 `Vivado HL WebPACK` 版本安装 29 | 30 | 31 | 32 | - 默认的安装选项比较多,可以只选择几个必须的,其中 `Device`要选择 `7 Series` 的 `Artix-7` 33 | 34 | 35 | 36 | - 然后选择一个安装路径就可以开始下载安装了,可以看到,Vivado 的下载安装需要大量的磁盘空间(约20G),下载安装之前请确保磁盘空间足够。 37 | 38 | 39 | 40 | - 下载安装过程如下 41 | 42 | -------------------------------------------------------------------------------- /others/ip.md: -------------------------------------------------------------------------------- 1 | # IP 介绍 2 | 3 | ## 简介 4 | 5 | IP 核就是知识产权核或知识产权模块的意思,在 EDA 技术开发中具有十分重要的地位。美国著名的 Dataquest 咨询公司将半导体产业的 IP 定义为“用于 ASIC 或 FPGA 中的预先设计好的电路功能模块”。(转自百度百科) 6 | 7 | 简单理解 IP 核就是一个别人写好的模块,与 C 语言中的库函数一样,可以供使用者调用。 8 | 9 | ## 使用 10 | 11 | 以下以调用 `Block Memory Generator` 为例。 12 | 13 | - 首先使用 Vivado 创建一个工程,在主界面的左侧边栏中点击 `IP Catalog`,会弹出 `IP Catalog` 界面,在 `Search` 处可以搜索需要的 IP,或者在 `Vivado Repository` 手动查找。 14 | 15 | ![](../img/others/p6.png) 16 | 17 | - 调用一个 `Block Memory` IP 核,双击选中的 IP 核,`Block Memory` 就是我们常说的 bram,可以用来作为指令和数据存储器。 18 | 19 | ![](../img/others/p7.png) 20 | 21 | - 双击之后会进入一个配置该模块的界面,在左上角的 `Documentation` 可以查看该 IP 手册,`Component Name` 可以为这个模块定义一个名字,方便调用,模块名下方的窗口就是对该模块进行具体配置界面。 22 | 23 | ![](../img/others/p8.png) 24 | 25 | - 配置 `Block Memory` 为一个指令存储器,如上图,选择 `Memory Type` 为 `Single Port ROM` 即单口只读存储器(数据存储器可以配置为 RAM)。在 `Port A Options` 选项卡中,可以配置端口数据宽度,以及数据深度,因为 MIPS 指令是定长 32 位,数据宽带定为 32,深度可以自定义,定为 1024 时该存储器大小就是 1024 Words,即 4KB。BRAM 读取访问是有延时的,当勾选上 `Primitives Output Register` 时延时是 2 Clock Cycle,不勾选是 1 Clock Cycle,一般不勾选。在 `Other Options` 选项卡中可以给该存储器配置 [coe](./cross_compiler.md#coe-文件说明) 文件,这样可以为该存储器初始化数据。 26 | 27 | ![](../img/others/p9.png) 28 | 29 | ![](../img/others/p10.png) 30 | 31 | - 在 `Summary` 选项卡可查看最终配置情况总结。配置完备,点击 `OK` 即可。最终在 `Source` 目录可以看到该模块。此时这个模块跟你写的模块没有任何区别,只需按照他的接口要求来添加代码即可。 32 | 33 | ![](../img/others/p11.png) 34 | 35 | - 如何获取该模块接口信息?可以查看文档说明。另外一种方式是点击在 `Source` 目录点击 `IP Source` 找到该模块,展开 `Instantiation Template` 可以看到一个 `inst_rom.veo` 文件,双击该文件,在代码编辑区查看内容,其中的代码即是该模块调用示例。按照示例来调用该模块即可。 36 | 37 | ![](../img/others/p12.png) 38 | 39 | ![](../img/others/p13.png) 40 | 41 | ## 将模块封装为 IP 42 | 43 | 现在,假设写好了一个模块,那么是可以将该模块封装为 IP,封装为 IP 之后就可以供他人或自己再调用。 44 | 45 | 以下介绍如何将代码封装为 IP。以封装当前工程为例。 46 | 47 | - 点击工具栏 `Tools -> Create and Package New IP`,在弹出框点击 `Next`。 48 | 49 | ![](../img/others/p14.png) 50 | 51 | - 之后,选择 `Package Options` 为 `Package your current project` 即封装当前工程。点击 `Next`。 52 | 53 | ![](../img/others/p15.png) 54 | 55 | - 之后是确定封装文件放置的目录。`Package IP in the project` 选择 `Include .xci files`。点击 `Next`,弹出界面点击 `Finish`。 56 | 57 | ![](../img/others/p16.png) 58 | 59 | - 之后会弹出 `Package IP` 标签页。 60 | - `Identification` 可查看并修改 IP 的相关信息。 61 | - `Compatibility` 标签下给出了这个 IP 可以支持的 FPGA 系列,默认是支持全部系列。 62 | - `File Groups` 中可以看到这个 IP 包含的文件。 63 | - `Customization Parameters` 是将 IP 设置为可配置,需要代码模块有可配置参数。 64 | - `Ports and Interfaces` 查看接口管脚信息。 65 | - `Customization GUI` 设计 IP 调用时的配置界面。 66 | - `Review and Package` 最终查看,点击 `Package IP` 来完成封装。 67 | 68 | ![](../img/others/p17.png) 69 | 70 | ## 调用封装 IP 71 | 72 | 现在来调用上文封装的 IP。 73 | 74 | - 新建一个工程,点击界面左侧的 `Setting` 弹出如下界面,选择 `Project Setting -> IP -> Repository`,点击 `+` 号,将上文封装 IP 时指定的封装文件放置目录添加进去,点击 `OK`。 75 | 76 | ![](../img/others/p18.png) 77 | 78 | - 完成上述操作之后,打开 `IP Catalog`,在 IP 目录会多出一个 `User Repository`,在其中可以找到刚才封装的模块。之后双击该模块就可以愉快的调用了。 79 | 80 | ![](../img/others/p19.png) 81 | -------------------------------------------------------------------------------- /others/vivado_skill.md: -------------------------------------------------------------------------------- 1 | # Vivado 使用小技巧汇总 2 | 3 | ## UI 功能 4 | 5 | ### 仿真 6 | - 仿真时可以关注以下方框中几个按钮 7 | - 1. 重新仿真,仅将仿真时间拉回到 0 ns,不重新编译源文件。 8 | - 2. 暂停或开始仿真 9 | - 3. 仿真时间线前进,具体前进时间为方框 4 中指定的时间。 10 | - 4. 设置每次时间线前进时间,左边是数字,右边是尺度。 11 | 12 | ![](../img/others/p21.png) 13 | 14 | - 在仿真的过程中,如果修改了某个源文件,无需再重新点击 `Run Simlation`,可以点击下图中红色方框按钮,刷新仿真结果。 15 | 16 | ![](../img/others/p20.png) 17 | 18 | - 查看仿真波形时,波形中的一根黄色的辅助线是十分有用的。在下图中,当前选中了信号 A(可以看到信号 A 的波形被加粗了),此时按键盘上的 `左右方向键`,黄色辅助线就会移动到信号 A 在左边或右边改变的那个时间点。这种方式可以用来查找信号改变时间点。 19 | 20 | ![](../img/others/p22.png) 21 | 22 | - 下图中红色方框内的按钮(快捷键 `ctrl + F`)可以用来查找信号值。黄色辅助线会自动移动到那个值的位置。 23 | 24 | ![](../img/others/p23.png) 25 | 26 | ## 快捷键 27 | 28 | |按键组合|功能| 29 | |-|-| 30 | |ctrl + F|当前文件查找| 31 | |ctrl + 鼠标滑轮|缩放波形图| 32 | |ctrl + shift + 光标|选中代码某一列| --------------------------------------------------------------------------------