├── .gitignore ├── docs ├── 404.md ├── coding_convention.md ├── doc_basic_logic.md ├── doc_complex_logic.md ├── doc_complex_timing.md ├── doc_finite_state_machine.md ├── doc_fpga.md ├── doc_logisim.md ├── doc_nexys.md ├── doc_simple_logic.md ├── doc_simple_timing.md ├── doc_testbench.md ├── doc_verilog.md ├── doc_vivado.md ├── images │ ├── basic_logic │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 2to1.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ ├── 9.png │ │ ├── Nexys4_DDR.png │ │ ├── schematic.png │ │ ├── schematic1.png │ │ ├── shuju.png │ │ └── xingwei.png │ ├── complex_logic │ │ ├── 1.png │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ └── 4.png │ ├── complex_timing │ │ ├── 1563615302529.png │ │ ├── 1563671799092.png │ │ ├── 1563673253101.png │ │ ├── 1563675030296.png │ │ ├── 1563675258127.png │ │ ├── 1563675293716.png │ │ ├── 1563675335903.png │ │ ├── 1563675367351.png │ │ ├── 1563680366835.png │ │ ├── 1563683217154.png │ │ ├── 1563720971518.png │ │ ├── 1563721124688.png │ │ ├── 1563721348108.png │ │ ├── 1563722138731.png │ │ ├── 1563975225313.png │ │ └── structure.jpg │ ├── finite_state_machine │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── fpga │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── logisim │ │ ├── logisim.png │ │ ├── logisim1.png │ │ ├── logisim10.png │ │ ├── logisim11.gif │ │ ├── logisim12.png │ │ ├── logisim13.png │ │ ├── logisim14.gif │ │ ├── logisim15.png │ │ ├── logisim16.png │ │ ├── logisim17.png │ │ ├── logisim18.png │ │ ├── logisim19.gif │ │ ├── logisim2.png │ │ ├── logisim20.png │ │ ├── logisim21.png │ │ ├── logisim22.png │ │ ├── logisim23.png │ │ ├── logisim24.png │ │ ├── logisim25.png │ │ ├── logisim3.png │ │ ├── logisim4.gif │ │ ├── logisim5.png │ │ ├── logisim6.gif │ │ ├── logisim7.gif │ │ ├── logisim8.gif │ │ └── logisim9.gif │ ├── nexys │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 21.png │ │ ├── 22.png │ │ ├── 23.png │ │ ├── 24.png │ │ ├── 25.png │ │ ├── 26.png │ │ ├── 27.png │ │ ├── 28.png │ │ ├── 29.png │ │ ├── 3.png │ │ ├── 30.png │ │ ├── 31.png │ │ ├── 32.png │ │ ├── 33.png │ │ ├── 34.png │ │ ├── 35.png │ │ ├── 36.png │ │ ├── 37.png │ │ ├── 38.png │ │ ├── 39.png │ │ ├── 4.png │ │ ├── 40.png │ │ ├── 41.png │ │ ├── 42.png │ │ ├── 43.png │ │ ├── 44.png │ │ ├── 45.png │ │ ├── 46.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── simple_logic │ │ ├── 1.png │ │ ├── 10.jpg │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.jpg │ │ └── 9.jpg │ ├── simple_timing │ │ ├── 1563343618646.png │ │ ├── 1563343625669.png │ │ ├── 1563348458064.png │ │ ├── 1563348467432.png │ │ ├── 1563348507286.png │ │ ├── 1563351467888.png │ │ ├── 1563351546606.png │ │ ├── 1563351645754.png │ │ ├── 1563351653862.png │ │ ├── 1563381597066.png │ │ ├── 1563382256831.png │ │ ├── 1563422019450.png │ │ ├── 271607238061109.jpg │ │ └── 271611489786197.jpg │ ├── testbench │ │ ├── 1564495138182.png │ │ ├── 1564497081267.png │ │ └── 1564497101657.png │ ├── verilog │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 21.png │ │ ├── 22.png │ │ ├── 23.png │ │ ├── 24.png │ │ ├── 25.png │ │ ├── 26.png │ │ ├── 27.png │ │ ├── 28.png │ │ ├── 29.png │ │ ├── 3.png │ │ ├── 30.png │ │ ├── 31.png │ │ ├── 32.png │ │ ├── 33.png │ │ ├── 34.png │ │ ├── 35.png │ │ ├── 36.png │ │ ├── 37.png │ │ ├── 38.png │ │ ├── 39.png │ │ ├── 4.png │ │ ├── 40.png │ │ ├── 41.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ └── vivado │ │ ├── 1563975870237.png │ │ ├── 1563976105757.png │ │ ├── 1563976287338.png │ │ ├── 1563977072544.png │ │ ├── 1563977087617.png │ │ ├── 1563977117169.png │ │ ├── 1563977129985.png │ │ ├── 1563977283279.png │ │ ├── 1563977387856.png │ │ ├── 1563977423656.png │ │ ├── 1563977433777.png │ │ ├── 1563977458759.png │ │ ├── 1563977580563.png │ │ └── 1563977690375.png ├── index.md └── katex.js ├── mkdocs.yml └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | /site/ 2 | -------------------------------------------------------------------------------- /docs/404.md: -------------------------------------------------------------------------------- 1 | Sorry, but the page you were trying to view does not exist. Try searching for it or looking at the URL to see if it looks correct. 2 | -------------------------------------------------------------------------------- /docs/coding_convention.md: -------------------------------------------------------------------------------- 1 | # 代码风格规范 2 | 3 | ## 空行 4 | 5 | ```verilog 6 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); 7 | input [1:0] in0, in1, in2, in3; 8 | input s1, s0; 9 | output reg [1:0] out; 10 | 11 | //变量声明后空行 12 | always @(*) 13 | begin 14 | case ({s1,s0}) 15 | 2'b00: out = in0; 16 | 2'b01: out = in1; 17 | 2'b10: out = in2; 18 | default: out = in3; 19 | endcase 20 | end 21 | endmodule 22 | 23 | //两模块间空行 24 | module mux2_to_1(/*...*/); 25 | /**/ 26 | endmodule 27 | ``` 28 | 29 | ## 空格 30 | 31 | ```verilog 32 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); //模块名后不留空格 33 | input [1:0] in0, in1, in2, in3; 34 | input s1, s0; 35 | output reg [1:0] out; 36 | 37 | always @(*) //关键字后空格(always后加空格) 38 | begin 39 | //关键字后空格(case后加空格) 40 | case ({s1, s0}) 41 | 2'b00: out = in0; //分号向前紧跟 42 | 2'b01: out = in1; 43 | //赋值运算符、关系运算符、算术运算符、逻辑运算符、位运算符等双目运算符前后都要加空格 44 | 2'b10: out = in2; 45 | default: out = in3; 46 | endcase 47 | end 48 | endmodule 49 | //单目运算符前后不加空格 50 | ``` 51 | 52 | ## 缩进 53 | 54 | ```verilog 55 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); 56 | input [1:0] in0, in1, in2, in3; 57 | input s1, s0; 58 | output reg [1:0] out; 59 | 60 | always @(*) 61 | begin 62 | case ({s1,s0}) //case在always里,要缩进 63 | 2'b00: out = in0; //case的的每一条在case里,也要缩进 64 | 2'b01: out = in1; 65 | 2'b10: out = in2; 66 | default: out = in3; 67 | endcase 68 | end 69 | endmodule 70 | ``` 71 | 72 | 缩进原则:如果地位相等,则不需要缩进;如果属于某一个代码的内部代码就需要缩进 73 | 74 | ## 对齐 75 | 76 | ```verilog 77 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); 78 | input [1:0] in0, in1, in2, in3; 79 | input s1, s0; 80 | output reg [1:0] out; 81 | 82 | always @(*) 83 | begin //begin和end要独占一行,且不缩进 84 | case ({s1,s0}) 85 | 2'b00: out = in0; 86 | 2'b01: out = in1; 87 | 2'b10: out = in2; 88 | default: out = in3; 89 | endcase 90 | end 91 | endmodule 92 | ``` 93 | 94 | ## 代码行 95 | 96 | ```verilog 97 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); 98 | input [1:0] in0, in1, in2, in3; 99 | input s1, s0; 100 | output reg [1:0] out; 101 | 102 | always @(*) //always、if、else等独占一行 103 | begin 104 | case ({s1,s0}) 105 | 2'b00: out = in0; //一行代码只做一件事情,如只写一条语句 106 | 2'b01: out = in1; 107 | 2'b10: out = in2; 108 | default: out = in3; 109 | endcase 110 | end 111 | endmodule 112 | ``` 113 | 114 | ## 注释 115 | 116 | ```verilog 117 | module mux4_to_1(out, in0, in1, in2, in3, s1, s0); //注释开始符号与代码之间有空格 118 | input [1:0] in0, in1, in2, in3;//4个待选输入 119 | input s1, s0; //选择信号 120 | output reg [1:0] out; //存放被选择出的数据 121 | 122 | always @(*) 123 | begin 124 | case ({s1,s0}) 125 | 2'b00: out = in0; //in0的值赋给out <- 这是一条多余注释 126 | 2'b01: out = in1; 127 | 2'b10: out = in2; 128 | default: out = in3; 129 | endcase 130 | end 131 | endmodule 132 | ``` 133 | 134 | 原则: 135 | 136 | 1. 注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多会让人眼花缭乱。 137 | 2. 边写代码边注释,修改代码的同时要修改相应的注释,以保证注释与代码的一致性,不再有用的注释要删除。 138 | 3. 如果代码本来就是清楚的,则不必加注释。 139 | -------------------------------------------------------------------------------- /docs/doc_basic_logic.md: -------------------------------------------------------------------------------- 1 | # 基础逻辑门 2 | 3 | ## Verilog HDL 简介 4 | 5 | Verilog HDL 设计语言支持 3 种设计风格:门级,数据流级和行为级。门级和数据流级设计风格通常用于 6 | 设计组合逻辑电路,而行为级设计风格既可以用于设计组合逻辑电路又可以设计时序逻辑电路。本次实验 7 | 通过使用 Vivado 2015.1 软件工具,以 Basys3 和 Nexys4 DDR 开发板为目标板,设计简单的组合逻辑电路来 8 | 展示 3 种设计风格的用法。请参考 Vivado 手册了解如何使用 Vivado 工具创建工程并验证数字电路。 9 | 10 | ## Nexys4 DDR 简介 11 | 12 | Nexys4 DDR 特性如下:(译者注:开发板各批次参数不同,仅供参考 13 | 14 | - 128 MiB DDR 2 SDRAM 15 | - 16Mbytes SPI (quad 模式) PCM 非易失型存储器 16 | - 16Mbytes 并行 PCM 非易失型存储器 17 | - 10/100 以太网 PHY 18 | - USB-UART 和 USB-HID 端口 (用于鼠标和键盘) 19 | - 8-bit VGA 端口 20 | - 100MHz CMOS 振荡器 21 | - 72 个 I/O 连接到扩展连接器 22 | - GPIO 包括 8 个 LED,5 个按键开关,8 个拨码开关和 2 个 4 位 7 段数码管 23 | Nexys4 DDR 开发板如下图所示 24 | 25 |  26 | 27 | ## 门级建模 28 | 29 | Verilog HDL 支持内建的原始的门级设计。门级支持包括多输入、多输出、三态和拉态。多输入门支持包括:and, nand, or, nor, xor, 和 xnor,它们的输入为 2 个及以上,输出只有 1 个。多输出门支持包括 buf 和 not,它们的输出为 2 个及以上,输入只有 1 个。Verilog HDL 语言还支持三态门:bufif0, bufif1, notif0, 和 notif1。这些三态门有一个输入,一个控制信号和一个输出。拉门支持包括 30 | pullup 和 pulldown,只有一个输出(没有输入)。这些门的零延迟的基本语法如下: 31 | 32 | ```verilog 33 | and | nand | or | nor | xor | xnor [instance name] (out, in1, …, inN); // [] is optional and | is selection 34 | buf | not [instance name] (out1, out2, …, out2, input); 35 | bufif0 | bufif1 | notif0 | notif1 [instance name] (outputA, inputB, controlC); 36 | pullup | pulldown [instance name] (output A); 37 | ``` 38 | 39 | 你也可以在同一语句中,用逗号分隔,创建多个相同类型门的实例,比如: 40 | 41 | Verilog HDL 语言也允许在实例化门电路时加入延迟。加入的延迟来自输入或输出。这些延迟可以表达为上升、下降或关断延迟;在一个实例中可以使用 1、2 或 3 种延迟。关断延迟可以用于输出能被关掉的门 (如 notif1). 42 | 比如, 43 | 44 | ```verilog 45 | and #5 A1(Out, in1, in2); // the rise and fall delays are 5 units 46 | and #(2,5) A2(out2, in1, in2); // the rise delay is 2 unit and the fall delay is 5 47 | units notif1 #(2, 5, 4) A3(out3, in2, ctrl1); //the rise delay is 2, the fall delay is 5, and the turn- off delay is 4 unit 48 | ``` 49 | 50 | ## 实验目标 51 | 52 | 完成本次实验后,你将有能力: 53 | 54 | - 使用门级、数据流级和行为级 3 种风格设计一位和多位组合逻辑电路 55 | - 设计模型读取拨码开关和按键开关并输出到 LED 和 7 段数码管 56 | - 仿真并理解设计的输出 57 | - 创建分层的设计 58 | - 综合,实现并生成比特流文件 59 | - 下载比特流文件到开发板,并验证功能 60 | 61 | ## 使用门级建模风格设计 2-to-1 多路选择器并下载验证结果 62 | 63 | 由我们数字电路课本的知识我们知道一个 2-to-1 多路选择器的电路大致如下如所示: 64 | 65 |  66 | 67 | ### 实验步骤 68 | 69 | 1. 打开 Vivado 并创建空白工程,取名为 lab1.1 (参考 Vivado2015.1 手册 Step 1)。 70 | 71 |  72 | 73 |  74 | 75 |  76 | 77 | 创建文件 create file 78 | 79 |  80 | 81 | 添加 xdc 文件 82 | 83 |  84 | 85 | 选择配置文件 86 | 87 |  88 | 89 | 2. 使用门级建模风格创建 Verilog module 包含 3 个输入 (in1,in2,select) 和 1 个输出 (out) (参考 Vivado2015.1 手册 Step 1). 90 | 91 | 提示:单击在 New Project 窗口,Add Source 上的绿色加号按钮。然后单击 Create File。修改文件名为 lab1_1_1,单击 OK。确认目标语言和仿真语言都设置为 Verilog。单击两次 Next。 92 | 93 | 3. 将适合开发板的 XDC 文件添加到工程。 94 | 95 | 提示:单击在 New Project 窗口 Add Constraints 上的绿色加号按钮。单击 AddFile.选择 Basys3_Master.xdc (Basys3) 或 Nexys4DDR_Master.xdc (Nexys4 DDR)。点击 Next。 96 | 97 | 4. 在 New Project 窗口选择 xc7a35tcpg236-1(Basys3) 或 xc7a100tcsg324-1(Nexys4 DDR)。单击 Next。单击 Finish。 98 | 99 | 5. 一个定义 Module 的窗口会出现,通过单击 Port Name 并输入变量名,创建 3 个输入 (in1, in2, select) 和 1 个输出 (out) 。通过单击下拉列表选择正确的方向修改 Direction。单击 OK. 100 | 101 |  102 | 103 | 6. 打开 lab1.1.v 文件编辑其中内容。在分号 (;) 后添加上文电路的结构逻辑。选择 File > Save File 或 CRTL-S 保存。 104 | 105 | 7. 单击 RTL Analysis 上的 Elaborated Design 选项卡。 106 | 8. 单击 Schematic 查看门级建模的设计。 107 | 108 | ### 参考代码和门级建模的设计 109 | 110 | 我们可以使用门级建模的方式写,verilog 的代码如下: 111 | 112 | ```verilog 113 | module lab1_1( 114 | input in1,in2, 115 | input select, 116 | output out 117 | ); 118 | wire temp1,temp2,temp3; 119 | not (temp1,select); 120 | and (temp2,temp1,in1); 121 | and (temp3,select,in2); 122 | or (out,temp2,temp3); 123 | endmodule 124 | ``` 125 | 126 | 点击 Schematic 查看门级建模的设计 127 | 128 |  129 | 130 | 我们可以看到大致如下的电路: 131 | 132 |  133 | 134 | 由此我们可以知道我们设计的门级建模的确是对的。 135 | 136 | 编辑 XDC 文件。去注释并将 SW0 和 SW1 赋给 in1 和 in2, SW7 给 select, LED0 给 out。保存 XDC 文件。生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能 137 | 138 | 打开 xdc 文件 139 | 140 |  141 | 142 | 修改 xdc 文件对应段落: 143 | 144 | ```shell 145 | set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { in1 }]; #IO_L24N_T3_RS0_15 Sch=sw[0] 146 | set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { in2 }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] 147 | #set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] 148 | #set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] 149 | #set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] 150 | #set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] 151 | #set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] 152 | set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { select }]; #IO_L5N_T0_D07_14 Sch=sw[7] 153 | #set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] 154 | #set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] 155 | #set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] 156 | #set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] 157 | #set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] 158 | #set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] 159 | #set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] 160 | #set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] 161 | 162 | 163 | ## LEDs 164 | 165 | set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { out }]; #IO_L18P_T2_A24_15 Sch=led[0] 166 | # set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] 167 | # set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] 168 | # set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] 169 | # set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] 170 | # set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] 171 | # set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] 172 | # set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] 173 | #set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] 174 | #set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] 175 | #set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] 176 | #set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] 177 | #set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] 178 | #set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] 179 | #set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] 180 | #set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] 181 | ``` 182 | 183 | ## 数据流级建模 184 | 185 | 数据流级建模风格主要用于描述组合逻辑电路。一种基本的手法就是使用持续赋值 (continuous assignment)。在持续赋值中,一个值被指派到一种叫做线网 (net) 的数据类型。 186 | 持续赋值的语法为: 187 | 188 | ```verilog 189 | assign [delay] LHS_net = RHS_expression; 190 | ``` 191 | 192 | 其中 LHS_net 是 1bit 或多 bit 的目标线网,而 RHS_expression 是一个包含各种运算符 (operator) 的表达式 (expression) 。该语句在任何时候都对源操作数值的任何更改进行运算,并将结果经过延迟单元后赋值给目标线网。在 Part 1 中的门级建模风格的例子可以用数据流级建模风格的持续赋值表达。比如: 193 | 194 | ```verilog 195 | assign out1 = in1 & in2; // perform and function on in1 and in2 and assign the result to out1 196 | assign out2 = not in1; 197 | assign #2 z[0] = ~(ABAR & BBAR & EN); // perform the desired function and assign the result after 2 units 198 | ``` 199 | 200 | 持续赋值语句中的目标可以是下面的一种: 201 | 202 | 1. 标量线网 scalar net (比如上面第 1 和 2 个例子) 203 | 2. 向量线网 Vector net 204 | 3. 向量线网的常数位选定 Constant bit-select of a vector (比如上面第 3 个例子) 205 | 4. 向量线网的常数部分选定 Constant part-select of a vector 206 | 5. 以上任意的拼接 207 | 208 | 我们再举一些例子,其中用到了标量和向量线网: 209 | 210 | ```verilog 211 | wire COUNT, CIN; // scalar net declaration 212 | wire [3:0] SUM, A, B; // vector nets declaration 213 | assign {COUT,SUM} = A + B + CIN; // A and B vectors are added with CIN and the result is 214 | // assigned to a concatenated vector of a scalar and vector nets 215 | ``` 216 | 217 | 需要注意的是,多个持续赋值不能使用同一个目标线网。 218 | 219 | ## 使用数据流级建模风格设计 2-to-1 多路选择器并下载验证结果 220 | 221 | 对应电路图: 222 | 223 |  224 | 225 | ### 实验步骤 226 | 227 | 1. 打开 Vivado 并创建空白工程取名为 lab1.2。 228 | 2. 使用数据流级建模风格,创建一个 Verilog module 并增加 2 个 2-bit 输入 (in1[1:0], in2[1:0]),1 个 1bit 229 | 选择信号输入 (select) 和一个 2-bit 输出 (out[1:0])。 230 | 3. 添加 XDC 文件到工程。编辑 XDC 文件,将 SW0 和 SW1 赋给 in1[1:0], SW2 和 SW3 赋给 in2[1:0],SW7 赋给 select,LED0 和 LED1 赋给 out[1:0]. 231 | 4. 综合你的设计。 232 | 5. 实现你的设计。 233 | 234 | ### 参考代码和数据流级建模的设计 235 | 236 | 由于这里的选择信号 select 只有一位,在使用数据流级建模的时候,我们需要对简单的选择信号进行简单的位扩展,让选择器更加适合我们使用的情况。 237 | 我们可以编写如下的代码来表达: 238 | 239 | ```verilog 240 | module lab1_2( 241 | input [1:0]in1,in2, 242 | input select, 243 | output [1:0]out 244 | ); 245 | wire [1:0]temp1,temp2,temp3,temp4; 246 | assign temp4={select,select}; 247 | assign temp1={~select,~select}; 248 | assign temp2=temp1&in1; 249 | assign temp3=temp4&in2; 250 | assign out=temp2|temp3; 251 | endmodule 252 | ``` 253 | 254 | 点击 Schematic 查看门级建模的设计,我们可以看到大致如下的电路: 255 | 256 |  257 | 258 | 编辑 XDC 文件。去注释并将 SW0 和 SW1 赋给 in1 和 in2, SW7 给 selecet, LED0 给 out。保存 XDC 文件。生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能 259 | 260 | ## 行为级建模 261 | 262 | 行为级建模通常用于描述复杂的电路。行为级建模主要用于设计时序逻辑电路,但也可以用于设计纯组合逻辑电路。一个电路的行为级建模(语句)如下: 263 | 264 | ```verilog 265 | initial Statements 266 | always Statements 267 | ``` 268 | 269 | 一个模块可以包含任意数量的 initial 和 always 语句,并且可以在其中包含一个或多个过程语句。这些 initial 和 always 语句会同时执行(换句话说,它们用于描述并行的过程,即它们在模块中出现的顺序没有关系),而过程语句是按序执行的(换句话说,它们出现的顺序有影响)。 270 | 271 | initial 和 always 语句都在 time=0 时刻执行,在其余时间只有 always 语句执行。语法如下: 272 | 273 | ```verilog 274 | initial [timing_control] procedural_statements; 275 | always [timing_control] procedural_statements; 276 | ``` 277 | 278 | **其中的过程语句 procedural_statement 是下面之一:** 279 | 过程赋值 procedural assignment 280 | 条件语句 conditional statement 281 | 案例语句 case statement 282 | 循环语句 loop statement 283 | 等待语句 wait statement 284 | 285 | **initial 语句是不可综合的(non-synthesizable)通常用在测试中。always 语句是可综合的 (synthesizable)并且最终产生的电路可以是组合的也可以是时序的。为了生成组合逻辑电路,always 块:(i) 不能是对边沿敏感的 (ii) 条件语句的每一个分支都需要定义好输出 (iii)case 语句中的每个案例(case)需要定义所有输出且必须有一个默认情况(default case)。有关这个话题的更详细讨论在 Lab 7 中涉及。语句的目标 (LHS) 须为寄存器(reg)类型; 可以是标量或向量。**举个例子: 286 | 287 | ```verilog 288 | reg m; // scalar reg type 289 | reg [7:0] switches; // vector reg type 290 | ``` 291 | 292 | 下面是一个 2-to-1 多路选择器模型的例子。 293 | 294 | ```verilog 295 | always @ (x or y or s) 296 | if(s==0) 297 | m=y; 298 | end 299 | else 300 | m=x; 301 | ``` 302 | 303 | ## 仿真(测试文件) 304 | 305 | 要测试我们设计的模块功能是否正常,最直接的办法就是烧写到 FPGA 芯片中进行验证,但是这种方式往往结果并不直观,且出现问题后也不容易定位。为提高工作效率,我们可通过电脑仿真的方式进行功能验证,待仿真通过后,再烧写到 FPGA 中,这样可以快速排除电路中存在的绝大多数 bug。在电脑上进行仿真,除了我们设计的功能模块之外,还需要另一模块——testbench,用于产生被测模块所需的激励信号。由于 testbench 只是用于电脑端的仿真,而不需要最终综合成电路,因此其写法更加灵活,可以使用 verilog 语法中的一些不可综合的语句,如 initial、#、$display、$readmemb、forever 等。 306 | 假设我们的被测模块完成以下功能 307 | 308 |  309 | 310 | 其 verilog 代码为: 311 | 312 |  313 | 314 | 测试方法可以大致分为 3 种,这里我们会对三种测试方法都做介绍,但在这个实验中使用的简单测试文件,其他两种方法会在之后的实验中再具体使用: 315 | 316 | ### 简单测试文件 317 | 318 | 最简单的测试文件可以写成如下形式: 319 | 320 |  321 | 322 | 语法说明: 323 | testbench 文件一般不包含任何输入输出信号 324 | 将被测模块实例化,被测模块的输入信号定义成 reg 类型,输出信号定义成 wire 类型。 325 | initial:通过 initial 块构造输入信号的波形,同一 initial 块内部的语句是串行执行的,多个 initial 块之间并发执行。 326 | 327 | ### 自检测试文件 328 | 329 | 带自检功能的测试文件如下所示,可以对输出结果进行判断,并打印错误信息 330 | 331 |  332 | 333 | 模块的输入信号给定之后,就有有结果输出,将实际输出结果于预期结果做比较,如果不同,则打印出错误信息。 334 | 335 | ### 测试向量 336 | 337 | 通过测试向量进行仿真 338 | 将输入信号的各种组合以及对应的输出结果构成一测试向量,则每个向量中都包含了一种输入状态,以及该状态下的期望输出结果 339 | 将该向量导入一内存数组 340 | 构造一时钟信号 341 | 在时钟的上升沿,将一个向量赋值给被测模块输入端,并在时钟的下降沿对被测模块输出与期望输出结果进行对比,如果不相同,则记录下该向量,至此向量全部测试完毕。 342 | 向量测试文件(example.tv):包含 a、b、c 以及 y_expected 343 | 344 | ```verilog 345 | 000_1 346 | 001_0 347 | 010_0 348 | 011_0 349 | 100_1 350 | 101_1 351 | 110_0 352 | 111_0 353 | ``` 354 | 355 | 测试文件 356 | 357 |  358 | 359 | 前面介绍了三种测试方法,三种方法各有其优缺点。 360 | 简单测试文件编写简单,容易上手,但需要人工判断仿真结果的正确性; 361 | 带自检的测试文件可以将错误信息打印出来,但编写稍微复杂一些,且激励波形仍需通过人工输入代码来完成; 362 | 测试向量法测试文件编写最为复杂,还需要编写一个用于跟被测模块结果进行比较的黄金模型,但此种方法测试最为充分,且后续维护起来也最容易。 363 | 364 | ## 使用行为级建模风格设计 2-to-1 多路选择器并下载验证结果 365 | 366 | 对应电路图: 367 | 368 |  369 | 370 | ### 实验步骤 371 | 372 | 1. 打开 Vivado 并创建空白工程取名为 lab1.3。 373 | 374 | 2. 使用行为级建模风格,创建一个 Verilog module 并增加 2 个 2-bit 输入 (in1[1:0], in2[1:0]),1 个 1bit 375 | 选择信号输入 (select) 和一个 2-bit 输出 (out[1:0])。 376 | 377 | 3. 添加 XDC 文件到工程。编辑 XDC 文件,将 SW0 和 SW1 赋给 in1[1:0], SW2 和 SW3 赋给 in2[1:0],SW7 赋给 select,LED0 和 LED1 赋给 out[1:0]. 378 | 379 | 4. 对你的设计仿真 (行为级仿真 behavioral simulation) 100 ns,并分析输出。 380 | 381 | 5. 综合你的设计。 382 | 383 | 6. 实现你的设计。 384 | 385 | ### 参考代码和数据流级建模的设计 386 | 387 | ```verilog 388 | module lab1_3( 389 | input [1:0]in1,in2, 390 | input select, 391 | output reg [1:0]out 392 | ); 393 | always@(*) 394 | begin 395 | if(select) 396 | out=in2; 397 | else 398 | out=in1; 399 | end 400 | endmodule 401 | ``` 402 | 403 | 点击 Schematic 查看门级建模的设计 404 | 我们可以看到大致如下的电路: 405 | 406 |  407 | 408 | 编辑 XDC 文件。去注释并将 SW0 和 SW1 赋给 in1 和 in2, SW7 给 selecet, LED0 给 out。保存 XDC 文件。 409 | 生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能 410 | 411 | ### 仿真代码的编写和测试 412 | 413 | 首先,添加仿真代码: 414 | 415 |  416 | 417 | 选择点击 add source 或者使用快捷键 ALT+A 来打开,选择 add or create simulation sources 418 | 419 |  420 | 421 | 创建文件 lab1.3.tb,把之前 lab1.3 中的代码中的输入定义为 reg 类型(可以直接赋值),输出定义为 wire 类型,之前的文件实例化进入仿真代码。 422 | 423 | ```verilog 424 | module lab1_3_tb( 425 | ); 426 | reg [1:0]in1,in2; 427 | reg select; 428 | wire [1:0]out; 429 | lab1_3 dut(in1,in2,select,out); //实例化模块 430 | initial begin 431 | in1=0; in2=0; select=0; #10; 432 | in1=1; #10; 433 | in2=2; #10; 434 | select=1; #10; 435 | in1=2; #10; 436 | in2=3; #10; 437 | select=0; #10; 438 | in1=0; #10; 439 | select=1; #10; 440 | end 441 | endmodule 442 | ``` 443 | 444 | 把测试模块定义为顶层模块: 445 | 446 |  447 | 448 | 设定仿真的配置(simulation settings): 449 | 450 |  451 | 452 | 设置仿真时间为 100ns: 453 | 454 |  455 | 456 | 开始仿真: 457 | 458 |  459 | 460 | 查看仿真,判断我们代码的正确性: 461 | 462 |  463 | 464 | ## 扩展实验内容 465 | 466 | 用门级建模的方式,数据流建模或者行为级建模的方式设计一个 4 选 1 的选择器,要求将 SW0,SW1,SW2,SW3 赋给 in1,in2, in3,in4,SW7,SW8 给 selecet1,select2.保存 XDC 文件。先编写仿真代码来测试其正确性,然后生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能 467 | 468 | ## 总结 469 | 470 | 本次实验中,你创建了多个 Vivado 工程设计了各种电路模型。你实现了设计并在硬件和仿真环境中验证了功能正确性。你学会了三种建模风格。门级和数据流级建模主要用于组合电路,而行为级建模支持组合和时序电路。本实验中你使用了行为级建模风格完成了组合电路的设计。在后面几个实验中,你会使用数据流级建模设计各种组合电路,从 Lab 7 开始,你将使用行为级建模设计时序电路。 471 | -------------------------------------------------------------------------------- /docs/doc_complex_logic.md: -------------------------------------------------------------------------------- 1 | # 复杂组合逻辑电路 2 | 3 | ## 编码器,译码器和存储器介绍 4 | 5 | 布尔表达式可以用以输出多变量布尔函数值,像 assign 这样的数据流构造可以用来模拟这样的布尔函数。存在多输入和多输出的电路,在这个实验中要求你参照关于如何使用 Vivado 工具创建工程和验证数字电路的教程,设计编码器,译码器和只读存储器。 6 | 7 | ## 实验目标 8 | 9 | - 利用行为建模设计多输出译码器 10 | - 利用行为建模设计编码器 11 | - 利用 Verilog 提供的 reg 数据类型和 `$readmemb` 系统函数设计只读存储器 12 | 13 | ## 设计一个 3-8 译码器。以 SW2-SW0 为输入,LED7-LED0 为输出;使用数据流建模结构 14 | 15 | ### 多输出译码电路 16 | 17 | 译码器是拥有多个输出的组合逻辑电路。它们被广泛用于存储芯片中,用来选择输入地址所寻址的一个字。例如一个 8 字宽的内存会拥有 3 位地址输入。译码器解码 3 位的输入地址产生一个选择信号,从 8 个字中选择地址相应的字。3-8 译码器的符号以及真值表如下: 18 | 19 |  20 | 21 | 这样的电路也称为二进制译码器,并且由于每个输出都有唯一的输入组合,所以可以使用数据流语句建模。 22 | 23 | ### 实验步骤 24 | 25 | 1. 打开 Vivado 并创建一个空工程并命名为 lab3_1。 26 | 27 | 2. 创建并添加一个 Verilog 模块,命名为 decoder.3to8.dataflow.v,然后定义译码器的三位输入 x 和 8 位输出 y。使用数据流建模。 28 | 29 | 3. 编写仿真文件来验证代码的正确 30 | 31 | 4. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚,将 x 分配给 SW2- 32 | SW0,将 y 分配给 LED7-LED0。注意对于一个给定的输入组合,只有一个 LED 会亮。 33 | 34 | 5. 综合,实现设计。 35 | 36 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 37 | 38 | ### 参考代码 39 | 40 | ```verilog 41 | module decoder_3to8_dataflow( 42 | input [2:0]x, 43 | output reg [7:0]y 44 | ); 45 | always@(*) 46 | case(x) 47 | 3'b000: y=8'b0000_0001; 48 | 3'b001: y=8'b0000_0010; 49 | 3'b010: y=8'b0000_0100; 50 | 3'b011: y=8'b0000_1000; 51 | 3'b100: y=8'b0001_0000; 52 | 3'b101: y=8'b0010_0000; 53 | 3'b110: y=8'b0100_0000; 54 | 3'b111: y=8'b1000_0000; 55 | endcase 56 | endmodule 57 | ``` 58 | 59 | ## 设计实现一个流行 IC 74138,使用数据流建模和你在 1-1 中使用的译码器 60 | 61 | ### 74138 译码器 62 | 63 | 集成三线—八线译码器 74138 除了 3 线到 8 线的基本译码输入输出端外,为便于扩展成更多位的译码电路和实现数据分配功能,74138 还有三个输入使能端 EN1,EN2A 和 EN2B。74138 真值表和内部逻辑图如下图: 64 | 65 |  66 | 67 |  68 | 69 | 所示符号图中,输入输出低电平有效用极性指示符表示,同时极性指示符又标明了信号方向。74138 的三个输入使能 (又称选通 ST) 信号之间是与逻辑关系,EN1 高电平有效,EN2A 和 EN2B 低电平有效。只有在所有使能端都为有效电平 (EN1EN2AEN2B=100) 时,74138 才对输入进行译码,相应输出端为低电平,即输出信号为低电平有效。在 EN1EN2AEN2B ≠100 时,译码器停止译码,输出无效电平 (高电平)。 70 | 这和你在 1 中创建的非常相似,它只是增加了控制(使能)信号 G1,/G2A,/G2B。这使得在有些系统中的解码更加简单。 71 | 72 | ### 实验步骤 73 | 74 | 1. 打开 Vivado 创建一个空工程,命名为 lab3_2. 75 | 76 | 2. 创建并添加 Verilog 模块,命名为 decoder_74138_dataflow,实例化你在 1-1 中开发的模块。添加额外的逻辑,使用数据流建模结构建模所设计的功能。 77 | 78 | 3. 编写仿真文件来验证代码的正确 79 | 80 | 4. 将你在 1 中使用的 XDC 文件添加到工程。修改 XDC 文件,将 g1 分配给 SW7,g2a_n 分配给 SW6,g2b_n 分配给 SW5。 81 | 82 | 5. 综合实现你的设计。 83 | 84 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 85 | 86 | ### 参考代码和分析 87 | 88 | 首先,修改 lab1 的 decoder_3to8_dataflow 模块,在其中加入 enable 信号 89 | 90 | ```verilog 91 | module decoder_3to8_dataflow( 92 | input enable, 93 | input [2:0]x, 94 | output reg [7:0]y 95 | ); 96 | always@(*) 97 | if(enable) 98 | case(x) 99 | 3'b000: y=8'b0000_0001; 100 | 3'b001: y=8'b0000_0010; 101 | 3'b010: y=8'b0000_0100; 102 | 3'b011: y=8'b0000_1000; 103 | 3'b100: y=8'b0001_0000; 104 | 3'b101: y=8'b0010_0000; 105 | 3'b110: y=8'b0100_0000; 106 | 3'b111: y=8'b1000_0000; 107 | endcase 108 | else y=8'b0000_0000; 109 | endmodule 110 | ``` 111 | 112 | 之后,decoder_74138_dataflow 模块的具体实现: 113 | 114 | ```verilog 115 | module decoder_74138_dataflow( 116 | input g1, 117 | input g2a_n, 118 | input g2b_n, 119 | input [2:0]x, 120 | output [7:0]y 121 | ); 122 | reg enable; 123 | always@(*) 124 | begin 125 | if(g1==1&&g2a_n==0&&g2b_n==0) 126 | enable=1; 127 | else enable=0; 128 | end 129 | decoder_3to8_dataflow A(enable,x,y); 130 | endmodule 131 | ``` 132 | 133 | ## 设计一个 8-3 编码器 134 | 135 | ### 多输出编码电路 136 | 137 | 编码器电路是出于对标准化,速度,保密性,安全性或者通过缩小尺寸来节省空间的考虑,将信息从一种形式(编码)转换为另一种形式(编码)的电路。在数字电路中,编码信息可以减小信息存储所用的空间,确定功能的优先级。广泛使用的编码电路的例子有,优先编码器,哈弗曼编码器等 138 | 139 | ### 8-3 编码器真值表 140 | 141 |  142 | 143 | ### 实验步骤 144 | 145 | 1. 打开 Vivado 创建一个名为 lab3_3 的空工程。 146 | 147 | 2. 创建并添加以 v 和 enable_in_n 为输入,以 y,enable_out 和 gs 为输出的 Verilog 模块。v 是一个 8 位的输入(表中标为 0 到 7),输入 en_in 只有一位(E1),输出 y 为 3 位(A2,A1,A0),en_out 为一位(E0),gs 为一位(GS)。 148 | 149 | 3. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚约束。将输入 v 分配给 SW7-SW0,enable.in.n 分配给 SW15,y 分配给 LED2-LED0,enable_out 分配给 LED7,gs 分配给 LED6。 150 | 151 | 4. 综合实现此设计。 152 | 153 | 5. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 154 | 155 | ### 参考代码和分析 156 | 157 | ```verilog 158 | module lab3_3( 159 | input enable_in_n, 160 | input [7:0]v, 161 | output reg [2:0]y, 162 | output reg enable_out, 163 | output reg gs 164 | ); 165 | always@(*) 166 | begin 167 | if(enable_in_n) 168 | {y[2:0],gs,enable_out}=5'b11111; 169 | else if(v[7]==0) 170 | {y[2:0],gs,enable_out}=5'b00001; 171 | else if(v[6]==0) 172 | {y[2:0],gs,enable_out}=5'b00101; 173 | else if(v[5]==0) 174 | {y[2:0],gs,enable_out}=5'b01001; 175 | else if(v[4]==0) 176 | {y[2:0],gs,enable_out}=5'b01101; 177 | else if(v[3]==0) 178 | {y[2:0],gs,enable_out}=5'b10001; 179 | else if(v[2]==0) 180 | {y[2:0],gs,enable_out}=5'b10101; 181 | else if(v[1]==0) 182 | {y[2:0],gs,enable_out}=5'b11001; 183 | else if(v[0]==0) 184 | {y[2:0],gs,enable_out}=5'b11101; 185 | else 186 | {y[2:0],gs,enable_out}=5'b11110; 187 | end 188 | endmodule 189 | ``` 190 | 191 | ## 设计一个 2 位比较器,用于比较两个 2-bit 的数字,并输出字 A 的十进制值大于、小于或者等于 B。你要模拟 ROM 并会用到$readmemb 函数 192 | 193 | ### 只读存储器 194 | 195 | 只读存储器(ROM)由互联阵列组成,由于存储二进制信息数组。它一旦存储了二进制信息,可以随时读取,但不能更改。大型的 ROM 通常用于存储不能被系统中其他电路更改的程序或者数据,小型的 ROM 可以用来实现组合电路。ROM 使用类似于 1-1 中的译码器来寻址特定的存储位置。 196 | 197 | 一个拥有 m 个地址输入引脚和 n 个数据输出引脚的 ROM 可以存储个字,每个字为 n 位。当给出一个地址访问这一存储器时,地址相应位置的字通过输出引脚读出。 198 | 199 | 在 Verilog 语言中,存储器可以使用 reg 数据类型的二维数组定义,如下: 200 | 201 | ```verilog 202 | reg [3:0] MY_ROM [15:0]; 203 | ``` 204 | 205 | 上面代码中 reg 是数据类型,MY_ROM 是一个 16×4 的内存,拥有 16 个地址,每个地址的宽度为 4bit。如果满足下面两个条件,这块内存就是只读的:(i)这块内存只能被读,不能被写入;(ii)内存应该以期望的数据初始化。Verilog 语言提供一个系统函数$readmemb 可以使用特定内容初始化内存。下面是定义并使用一个 4×2 的 ROM 的例子。 206 | 207 | ```verilog 208 | module ROM_4x2 (ROM_data, ROM_addr); 209 | output [1:0] ROM_data; 210 | input [1:0] ROM_addr; 211 | reg [1:0] ROM [3:0]; // defining 4x2 ROM 212 | assign ROM_data = ROM[ROM_addr]; 213 | // reading ROM content at the address ROM_addr 214 | initial $readmemb (“ROM_data.txt”, ROM, 0, 3); 215 | // load ROM content from ROM_data.txt file 216 | endmodule 217 | ``` 218 | 219 | 在此例中,ROM_data.txt 文件应该与 verilog 模块放在同一目录下(因为引用时没有使用绝对路径),并且文件中可以有 8 行或者更少,比如: 220 | 221 | ```verilog 222 | 10 223 | 0x 224 | 11 225 | 00 226 | ``` 227 | 228 | 注意,如果行数少于 ROM 的大小,则未指定的位置将会用 0 初始化,另外还有另一个系统函数$readmembh 允许数据文件使用十六进制编写。 229 | 230 | ### verilog 中$readmemb 和$readmemh 的使用 231 | 232 | 因为之前自己学习 verilog 中编写 readme 的文件,不是很懂是怎么写的,所以菜菜的我还去查了查用法,方便大家学习。(请你们不要嘲笑菜菜的助教啦) 233 | 在 Verilog 语法中,一共有以下六种用法: 234 | 235 | 1. `$readmemb("<数据文件名>",<存储器名>);` 236 | 2. `$readmemb("<数据文件名>",<存储器名>,<起始地址>);` 237 | 3. `$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);` 238 | 4. `$readmemh("<数据文件名>",<存储器名>);` 239 | 5. `$readmemh("<数据文件名>",<存储器名>,<起始地址>);` 240 | 6. `$readmemh("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);` 241 | 242 | 示例:`$readmemb` 的使用 243 | 244 | 先在 Verilog 代码目录下准备一个文件 `file1.txt`,存入数据:`1111 1010 0101 1x1z 1_1 1111` 或者 `11111010 0101 1x1z 1_1_1_111` 存在一行每个用空格隔开,跟分行存,输出结果是一样的,但是若在一行中不用空格隔开会出错,编译器会试图把一整行数据存在一个四位的存储单元中。 245 | 246 | 这些在你们之后初始化 rom 或者 ram 的 memory 都是很常用的啦(可能要到 cod 的时候吧) 247 | 248 | ### 实验步骤 249 | 250 | 1. 打开 Vivado 并创建一个名为 lab3_4 的工程。 251 | 252 | 2. 使用 ROM 和$readmemb 系统函数创建并添加一个 Verilog 模块,该模块拥有两个输入(a,b)和三个输出(lt,gt 和 eq)。 253 | 254 | 3. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚约束。将 a 分配给 SW3 到 SW2,b 分配给 SW1 到 SW0,lt 分配给 LED2,gt 分配给 LED1,eq 分配给 LED0。 255 | 256 | 4. 创建并添加描述设计输出的文本文件 257 | 258 | 上表列出了 b 与 a 比较前两项,继续这样的比较直到 b 和 a 都达到 11 为止。 259 | 260 | |a|b|lt|gt|eq| 261 | |:----:|:----:|:----:|:----:|:----:| 262 | |00|00|0|0|1| 263 | |00|01|1|0|0| 264 | |00|10|1|0|0| 265 | |00|11|1|0|0| 266 | |01|00|0|1|0| 267 | |01|01|0|0|1| 268 | |01|10|1|0|0| 269 | |01|11|1|0|0| 270 | |10|00|0|1|0| 271 | |10|01|0|1|0| 272 | |10|10|0|0|1| 273 | |10|11|1|0|0| 274 | |11|00|0|1|0| 275 | |11|01|0|1|0| 276 | |11|10|0|1|0| 277 | |11|11|0|0|1| 278 | 279 | 将上表的比较结果保存在一个.txt 文件中,然后点击位于 Flow Navigator 下的 Add Sources 按钮。选择 Add or create design sources 并点击 next。点击绿色的 plus 按钮然后点击 add file。添加你所创建的.txt 文件然后点击 finish. 280 | 281 | 5. 综合实现此设计。 282 | 283 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 284 | 285 | ### 参考代码和分析 286 | 287 | ```verilog 288 | module lab3_4( 289 | input [1:0]a, 290 | input [1:0]b, 291 | output lt, 292 | output gt, 293 | output eq 294 | ); 295 | reg [2:0] rom [15:0]; 296 | 297 | initial $readmemb ("compare.mem", rom); 298 | assign {lt,gt,eq}=rom[{a,b}]; 299 | endmodule 300 | ``` 301 | 302 | 可以采用相对路径或者绝对路径的方式写入 readme txt 文件,但是之前文档介绍的 add source 的方法 vivado 不支持 txt 格式,所以我们在这里采用添加 mem 文件的方法加入文件,这样的方法更加简单一点。 303 | comare.mem 文件具体内容: 304 | 305 | ```verilog 306 | 001 307 | 100 308 | 100 309 | 100 310 | 010 311 | 001 312 | 100 313 | 100 314 | 010 315 | 010 316 | 001 317 | 100 318 | 010 319 | 010 320 | 010 321 | 001 322 | ``` 323 | 324 | ## 扩展实验内容 325 | 326 | ### 使用 ROM 实现一个 2 位乘 2 位的乘法器,将结果以二进制形式输出到四个 LED 灯上 327 | 328 | #### 具体要求 329 | 330 | 1. 打开 Vivado 并创建一个名为 lab3_kuozhan1 的空工程。 331 | 332 | 2. 使用 ROM 和 `$readmemb` 系统函数创建并添加一个拥有两个两位输入(a,b)和一个四位输出(product)的 Verilog 模块。 333 | 334 | 3. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚约束。将 a 分配给 SW3-SW2,b 分配给 SW1-SW0,product 分配给 LED3-LED0。 335 | 336 | 4. 创建并添加描述设计输出的文本文件。 337 | 338 | 5. 综合实现此设计。 339 | 340 | 6. 生成比特流文件,下载到 Nexys4 开发板上验证功能。 341 | 342 | ### 使用在两个 lab1 中设计的 3-8 译码器扩展成一个 4-16 的译码器 343 | 344 | 1. 打开 Vivado 并创建一个空工程并命名为 lab3_kuozhan2。 345 | 346 | 2. 创建并添加 Verilog 模块,定义译码器的四位输入 x 和 16 位输出 y. 347 | 348 | 3. 编写仿真文件来验证代码的正确 349 | 350 | 4. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚,将 x 分配给 SW3- 351 | SW0,将 y 分配给 LED15-LED0。注意对于一个给定的输入组合,只有一个 LED 会亮。 352 | 353 | 5. 综合,实现设计。 354 | 355 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 356 | 357 | #### 具体要求 358 | 359 | ## 总结 360 | 361 | 在本次试验中,你学到了如何对多输出电路如译码器、编码器和 ROM 建模;你也学到了如何使用系统函数 `$readmemb` 对 ROM 进行初始化。Verilog 还支持很多系统函数,你将在下一个实验中学习另外一些。 362 | -------------------------------------------------------------------------------- /docs/doc_complex_timing.md: -------------------------------------------------------------------------------- 1 | # 复杂时序逻辑电路 2 | 3 | ## 1. 时序逻辑电路的基本结构和分类 4 | 5 | ### 1-1. 基本结构 6 | 7 | 时序逻辑电路由组合电路和存储电路两部分组成,通过反馈回路将两部分连成一个整体。时序逻辑电路的一般结构如下图所示。 8 | 9 |  10 | 11 | 图中,X~1~,…,X~n~为时序逻辑电路的**输入信号**;Z~1~,…,Z~m~为时序逻辑电路的**输出信号**;y~1~,…,y~s~为时序逻辑电路的**状态信号**,又称为组合电路的**状态变量**;Y~1~,…,Y~r~为时序逻辑电路中的**激励信号**,它决定电路下一时刻的状态;CP 为**时钟脉冲信号**,它是同步时序逻辑电路中的定时信号。 12 | 13 | 若记输入信号为 $\vec{X}$,输出信号为 $\vec{Z}$,激励信号为 $\vec{Y}$,状态信号为 $\vec{y}$,于是上述的 4 个向量之间的转换关系可以由下面的三个公式表示: 14 | 15 | $$ 16 | \vec{Z} = f(\vec{X},\vec{y}) 17 | \tag{1-1.1} 18 | $$ 19 | 20 | $$ 21 | \vec{Y} = g(\vec{X},\vec{y}) 22 | \tag{1-1.2} 23 | $$ 24 | 25 | $$ 26 | \vec{y^{n+1}} = h(\vec{Y},\vec{y^n}) 27 | \tag{1-1.3} 28 | $$ 29 | 30 | 其中,式 1-1.1 表达了输出信号与输入信号和状态信号之间的关系,被称为输出方程组;式 1-1.2 表示了激励信号与状态信号和输入信号之间的关系,称为时序电路的激励方程;式 1-1.3 表示了电路从现态到次态的转换过程,被称作状态转换方程。 31 | 32 | 在这里大家可以看到,上面的时序电路又是状态($\vec{y}$)依赖的,我们常把这样的电路叫做状态机。下一部分有对于状态机的详细描述,敬请期待:smile:。 33 | 34 | ### 1-2. 时序逻辑电路的分类 35 | 36 | #### 1-2-1. 异步时序电路与同步时序电路 37 | 38 | 关于这个问题在上一章有过讨论。这里还要再啰嗦两句。 39 | 40 | 可以这样理解:如果时序电路中个存储单元的状态更新不是同时发生的,则这种电路称为异步时序电路;如果个存储电路状态是在同一信号的同一边沿更新的,就可以称作同步时序电路。 41 | 42 | 导致这种更新不同步的原因可能是:电路的触发器的时钟输入端没有连接在相同的时钟脉冲上,或者这个电路里根本就没有时钟脉冲。 43 | 44 | #### 1-2-2. 米利型和摩尔型电路 45 | 46 | 关于这个问题的详细描述将在下一章出现。 47 | 48 | ## 2. 几个典型的时序逻辑电路 49 | 50 | 多个触发器在同一时钟下组合在一起,来保存相关信息的电路称为**寄存器**。就像触发器一样,寄存器也可以有其它的控制信号。你将了解具有附加控制信号的寄存器的行为。 51 | 52 | **计数器**是广泛使用的时序电路。在本次实验中,你将用几种方法设计寄存器和计数器。请参考 Vivado 教程上关于如何使用 Vivado 创建工程和验证电路。 53 | 54 | ### 2-1. 可同步重置、载入信号的寄存器 55 | 56 | 在计算机系统中,相关信息常常在同时被存储。寄存器(register)以这样的方式存储信息比特,即系统可以在同一时间写入或读出所有的比特。寄存器的例子包含数据、地址、控制和状态。简单的寄存器数据的输入引脚和输出引脚分开,但它们用相同的时钟源。一个简单寄存器的设计如下。 57 | 58 | ```verilog 59 | module Register (input [3:0] D, input Clk, output reg [3:0] Q); 60 | always @(posedge Clk) 61 | Q <= D; 62 | endmodule 63 | ``` 64 | 65 | 这个简单的寄存器会在每个时钟周期工作,保存需要的信息。然而,在有的情况下,需要只有在特定条件发生时,寄存器内容才被更新。比如,在计算机系统中的状态寄存器只在特定的指令执行时才更新。在这种情况下,寄存器的时钟需要用一个控制信号控制。这样的寄存器需要包含一个时钟使能引脚。下面是这种寄存器的设计。 66 | 67 | ```verilog 68 | module Register_with_synch_load_behavior(input [3:0] D, input Clk, 69 | input load, output reg [3:0] Q); 70 | always @(posedge Clk) 71 | if (load) 72 | Q <= D; 73 | endmodule 74 | ``` 75 | 76 | 另一个希望寄存器包含的特性是,当特定条件发生时,寄存器会重置存储的内容。下面是一个包含同步的(synchronous)重置和载入信号(重置的优先级高于载入)的简单寄存器的设计。 77 | 78 | ```verilog 79 | module Register_with_synch_reset_load(input [3:0] D, input Clk,input reset, 80 | input load, output reg [3:0] Q); 81 | always @(posedge Clk) 82 | if (reset) begin 83 | Q <= 4'b0; 84 | end 85 | else if (load) begin 86 | Q <= D; 87 | end 88 | endmodule 89 | ``` 90 | 91 | #### 实验目的 92 | 93 | 用上面的例子,设计一个 4-bit 寄存器,包含同步的重置和载入信号。编写一个测试用例并对你的设计仿真。对 Clk, D input, reset, load,和 output Q 赋值。在硬件中验证你的设计。 94 | 95 | #### 参考步骤 96 | 97 | 1. 打开 Vivado,创建一个工程命名为 lab6_1_1。 98 | 99 | 2. 创建 Verilog module 并添加包含同步重置和载入信号的 4-bit 寄存器。使用上面例子中提供的代码。 100 | 101 | 3. 编写一个测试用例,仿真 500ns,并分析输出。 102 | 103 | 若使用供参考的 Testbench,则最终仿真得到的波形应该如下: 104 | 105 |  106 | 107 | 4. 添加开发板相对应的 XDC 文件,编辑 XDC 文件,加入相关的引脚,将 Clk 赋给 SW15,D input 给 SW3-SW0,reset 给 SW4, load 给 SW5,Q 给 LED3- LED0。 108 | 109 | 5. 把下面这行代码加入 XDC 文件,使 SW15 允许被当作时钟使用。 110 | 111 | ```shell 112 | set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets { clk }]; 113 | ``` 114 | 115 | 6. 综合你的设计。 116 | 117 | 7. 实现你的设计,查看 Project Summary 和 Utilization table,注意到 1 个 BUFG 和 11 个 IO 被使用了。 118 | 119 | 8. 生成比特流文件,将其下载到 Nexys4 DDR 开发板,并验证功能。 120 | 121 | #### 参考代码 122 | 123 | 寄存器的实现代码参考例子即可,下面是 Testbench 的参考代码: 124 | 125 | ```verilog 126 | module Register1_tb(); 127 | reg Clk, reset, load; 128 | reg [3:0] D; 129 | wire [3:0] Q; 130 | Register_with_synch_reset_load TB(.Clk(Clk),.load(load),.reset(reset),.D(D),.Q(Q)); 131 | initial begin 132 | Clk = 0; 133 | forever begin 134 | #10 Clk = 1; 135 | #10 Clk = 0; 136 | end 137 | end 138 | initial begin 139 | load = 0; 140 | #60 load = 1; 141 | #20 load = 0; 142 | #40 load = 1; 143 | #20 load = 0; 144 | #55 load = 1; 145 | #20 load = 0; 146 | #65 load = 1; 147 | end 148 | initial begin 149 | reset = 0; 150 | #155 reset = 1; 151 | #85 reset = 0; 152 | end 153 | initial begin 154 | D = 4'b0000; 155 | #20 D = 4'b0101; 156 | #60 D = 4'b1001; 157 | end 158 | endmodule 159 | ``` 160 | 161 | ### 2-2. 可同步重置、同步置位、载入信号的寄存器 162 | 163 | 在一些仿真中,有必要把寄存器设置到一个预设值。对于这种情况,需要使用另一个控制信号,称为设置 set。一般情况下,在这种寄存器中,重置信号会比设置信号拥有更高优先级,而设置信号比载入信号拥有更高优先级。 164 | 165 | #### 实验目的 166 | 167 | 设计一个 4-bit 包含同步重置,设置和载入信号的寄存器。分配好 Clk, D input, reset, set,load 和 output Q。在硬件中验证功能。 168 | 169 | #### 参考步骤 170 | 171 | 1. 打开 Vivado,创建一个工程命名为 lab6_1_2. 172 | 173 | 2. 创建 Verilog module 并添加包含同步重置,设置和载入信号的 4-bit 寄存器。 174 | 175 | 3. 编写一个测试用例,仿真 500ns,并分析输出。 176 | 177 | 若使用供参考的 Testbench,则最终仿真得到的波形应该如下: 178 | 179 |  180 | 181 | 4. 添加开发板相对应的 XDC 文件,编辑 XDC 文件,加入相关的引脚。注意:你可能需要为你选择的拨码开关的 Clk pin 加入 CLOCK_DEDITCATED_ROUTE 特性(property)。 182 | 183 | 5. 综合你的设计。 184 | 185 | 6. 实现你的设计。查看 Project Summary 并注意使用资源。理解输出的结果。 186 | 187 | 7. 生成比特流文件,将其下载到 Nexys4 DDR 开发板,并验证功能。 188 | 189 | #### 参考代码 190 | 191 | ```verilog 192 | module Register_with_synch_reset_load_behavior(input [3:0] D, input Clk,input set, 193 | input reset, input load, output reg [3:0] Q); 194 | always @(posedge Clk) 195 | if (reset) begin 196 | Q <= 4'b0; 197 | end 198 | else if (set) begin 199 | Q <= 4'b1111; 200 | end 201 | else if (load) begin 202 | Q <= D; 203 | end 204 | endmodule 205 | ``` 206 | 207 | ```verilog 208 | module Register1_tb(); 209 | reg Clk, reset, set, load; 210 | reg [3:0] D; 211 | wire [3:0] Q; 212 | Register_with_synch_reset_load_behavior TB(.Clk(Clk),.set(set),.load(load),.reset(reset),.D(D),.Q(Q)); 213 | initial begin 214 | Clk = 0; 215 | forever begin 216 | #10 Clk = 1; 217 | #10 Clk = 0; 218 | end 219 | end 220 | initial begin 221 | load = 0; 222 | #60 load = 1; 223 | #20 load = 0; 224 | #40 load = 1; 225 | #20 load = 0; 226 | #55 load = 1; 227 | #20 load = 0; 228 | #65 load = 1; 229 | end 230 | initial begin 231 | reset = 0; 232 | #155 reset = 1; 233 | #85 reset = 0; 234 | end 235 | initial begin 236 | set = 0; 237 | #220 set = 1; 238 | #50 set = 0; 239 | end 240 | initial begin 241 | D = 4'b0000; 242 | #20 D = 4'b0101; 243 | #60 D = 4'b1001; 244 | end 245 | endmodule 246 | ``` 247 | 248 | ### 2-3. 4-bit 并行输入并行输出移位寄存器 249 | 250 | 还有一种寄存器称为移位寄存器。移位寄存器是当控制信号生效时,存储的二进制数据会左移或右移的寄存器。移位寄存器可以被进一步分类为并行载入串行输出,串行载入并行输出和串行载入串行输出。它们可能有也可能没有重置信号。 251 | 252 | 在 Xilinx FPGA,LUT 可以被用作串行移位寄存器;如果代码写对的话,1 个 LUT 就可以用作 1bit 输入 1bit 输出的 SRL32,因而可以提供非常经济的设计(而不是串联 32 个触发器)。它可以有也可以没有使能信号。当使能信号生效时,内部存储的数据会移位 1bit,1bit 新的数据也会移入。 253 | 254 | 下面是一个简单的没有使能信号的 1bit 串行移入移出寄存器的设计。在这个设计中移入的 bit 需要经过 32 个时钟周期移出。这个设计可以用来实现一个延迟线。 255 | 256 | ```verilog 257 | module simple_one_bit_serial_shift_register_behavior(input Clk, input 258 | ShiftIn, output ShiftOut); 259 | reg [31:0] shift_reg; 260 | always @(posedge Clk) 261 | shift_reg <= {shift_reg[30:0], ShiftIn}; 262 | assign ShiftOut = shift_reg[31]; 263 | endmodule 264 | ``` 265 | 266 | 如果我们要实现一个少于 32 个时钟周期的延迟线,可以修改上面这个设计。下面是一个 3 时钟周期的延迟线。 267 | 268 | ```verilog 269 | module delay_line3_behavior(input Clk, input ShiftIn, output ShiftOut); 270 | reg [2:0] shift_reg; 271 | always @(posedge Clk) 272 | shift_reg <= {shift_reg[1:0], ShiftIn}; 273 | assign ShiftOut = shift_reg[2]; 274 | endmodule 275 | ``` 276 | 277 | #### 实验目的 278 | 279 | 设计一个 4-bit 并行输入的向左移位寄存器。使用下图的信号刺激,编写一个测试用例并对你的设计仿真。 280 | 分配 Clk, ParallelIn, load, ShiftEn, ShiftIn, RegContent 和 ShiftOut.。在硬件上验证功能。 281 | 282 | #### 参考步骤 283 | 284 | 1. 打开 Vivado,创建一个工程命名为 lab6_1_4. 285 | 286 | 2. 创建 Verilog module,使用上面的代码,添加 4-bit 并行输入的向左移位寄存器。 287 | 288 | 3. 独立编写一个测试用例,仿真 400ns。输入信号的波形参考如下: 289 | 290 |  291 | 292 | 4. 添加开发板相对应的 XDC 文件,编辑 XDC 文件,加入相关的引脚。注意:你可能需要为你选择的拨码开关的 Clk pin 加入 CLOCK_DEDITCATED_ROUTE 特性(property)。 293 | 294 | 5. 综合你的设计。 295 | 296 | 6. 实现你的设计。 297 | 298 | 查看 Project Summary 并注意使用资源。理解输出的结果。 299 | 300 | 7. 生成比特流文件,将其下载到 Nexys4 DDR 开发板,并验证功能。 301 | 302 | #### 参考代码 303 | 304 | ```verilog 305 | module Parallelin_serialout_load_enable(input Clk, input ShiftIn,input [3:0] ParallelIn, 306 | input load, input ShiftEn, output ShiftOut, 307 | output [3:0] RegContent); 308 | reg [3:0] shift_reg; 309 | 310 | always @(posedge Clk) 311 | if(load) 312 | shift_reg <= ParallelIn; 313 | else if (ShiftEn) 314 | shift_reg <= {shift_reg[2:0], ShiftIn}; 315 | 316 | assign ShiftOut = shift_reg[3]; 317 | assign RegContent = shift_reg; 318 | endmodule 319 | ``` 320 | 321 | ### 2-4. 8-bit 计数器 322 | 323 | 计数器可以是异步的也可以是同步的。异步计数器只使用事件信号来对事件计数。而同步计数器,使用共有的时钟信号,因而当多个触发器必须改变状态时,状态的改变同时发生。二进制计数器是一种简单的计数器,当使能信号生效时会计数,当重置信号生效时会重置。当然,重置信号比使能信号的优先级高。 324 | 325 | 下面的电路图展示了这样的计数器。需要注意的是,清除信号是异步低电平生效的,而使能信号是同步高电平生效的。 326 | 327 |  328 | 329 | #### 实验目的 330 | 331 | 设计一个 8-bit 计数器,将上面的结构扩展至 8-bits。你的设计应该是分层级的,即先设计出 T 触发器,再通过建模实现 8-bit 计数器。T 触发器的实现方案也是多种的,你可以直接行为级建模实现,也可以利用之前实现过的 D 触发器实现,因为 T 触发器可以用 D 触发器构造,如下图。 332 | 333 |  334 | 335 | 编写一个测试用例并验证设计。分配 Clock input, Clear_n, Enable 和 Q。实现设计并在硬件上验证功能。 336 | 337 | #### 参考步骤 338 | 339 | 1. 打开 Vivado,创建一个工程命名为 lab6_2_1. 340 | 341 | 2. 创建并添加 Verilog module 以提供所需的功能。 342 | 343 | 3. 编写一个测试用例,并验证设计。 344 | 345 | 若使用参考测试用例,则得到的波形应该如下: 346 | 347 | ) 348 | 349 | 4. 添加开发板相对应的 XDC 文件,编辑 XDC 文件,加入相关的引脚。注意:你可能需要为你选择的拨码开关的 Clk pin 加入 CLOCK_DEDITCATED_ROUTE 特性(property)。 350 | 351 | 5. 综合你的设计并在 Synthesized Design 查看原理图(schematic)。指出用了什么资源,用了多少。 352 | 353 | 6. 实现你的设计。 354 | 355 | 7. 生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能。 356 | 357 | #### 参考代码 358 | 359 | ```verilog 360 | module T_ff_clear_behavior( 361 | input T, 362 | input Clk, 363 | input Clr, 364 | output reg Q 365 | ); 366 | always@(posedge Clk or negedge Clr)begin 367 | if(~Clr)begin 368 | Q <= 0; 369 | end 370 | else if(T) begin 371 | Q <= ~Q; 372 | end 373 | end 374 | endmodule 375 | ``` 376 | 377 | ```verilog 378 | module counter_8_bit( 379 | input Clk, 380 | input Clr, 381 | input Enable, 382 | output [7:0] Q 383 | ); 384 | T_ff_clear_behavior A1(.Clk(Clk),.Clr(Clr),.T(Enable),.Q(Q[0])); 385 | T_ff_clear_behavior A2(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0]),.Q(Q[1])); 386 | T_ff_clear_behavior A3(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1]),.Q(Q[2])); 387 | T_ff_clear_behavior A4(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1] & Q[2]),.Q(Q[3])); 388 | T_ff_clear_behavior A5(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1] & Q[2] & Q[3]),.Q(Q[4])); 389 | T_ff_clear_behavior A6(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1] & Q[2] & Q[3] & Q[4]),.Q(Q[5])); 390 | T_ff_clear_behavior A7(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1] & Q[2] & Q[3] & Q[4] & Q[5]),.Q(Q[6])); 391 | T_ff_clear_behavior A8(.Clk(Clk),.Clr(Clr),.T(Enable & Q[0] & Q[1] & Q[2] & Q[3] & Q[4] & Q[5] & Q[6]),.Q(Q[7])); 392 | endmodule 393 | ``` 394 | 395 | ```verilog 396 | module counter_8_bit_tb(); 397 | reg Clk,Clr,Enable; 398 | wire [7:0] Q; 399 | counter_8_bit TB(.Clk(Clk),.Clr(Clr),.Enable(Enable),.Q(Q)); 400 | initial begin 401 | Clk = 0; 402 | forever begin 403 | #10 Clk = 1; 404 | #10 Clk = 0; 405 | end 406 | end 407 | initial begin 408 | Clr = 1; 409 | #5 Clr = 0; 410 | #5 Clr = 1; 411 | end 412 | initial begin 413 | Enable = 0; 414 | #20 Enable = 1; 415 | #100 Enable = 0; 416 | #150 Enable = 1; 417 | end 418 | endmodule 419 | ``` 420 | 421 | ### 2-4. 4-bit 递减计数器 422 | 423 | 有些情况下,你可能要求计数器从非 0 的地方开始计数增或计数减,要求计数器到达指定值时停下。这是一个 4-bit 计数器的例子,它从 10 开始计数递减到 0。当计数值到 0 时,它会重新初始化到 10。在任何时候,如果使能信号是低电平,计数器会暂停计数,直到使能信号恢复。假定在计数开始前,载入信号就生效来载入预设值。 424 | 425 | ```verilog 426 | reg [3:0] count; 427 | wire cnt_done; 428 | assign cnt_done = ~| count; 429 | assign Q = count; 430 | always @(posedge Clock) 431 | if (Clear) 432 | count <= 0; 433 | else if (Enable) 434 | if (Load | cnt_done) 435 | count <= 4'b1010; // decimal 10 436 | else 437 | count <= count - 1; 438 | ``` 439 | 440 | #### 实验目的 441 | 442 | 参考上面的代码,设计一个 4-bit 递减计数器,包含同步载入、使能和清除。编写测试用例并验证功能。分配 Clock input, Clear,Enable, Load 和 Q。实现设计并在硬件上验证功能。 443 | 444 | #### 参考步骤 445 | 446 | 1. 打开 Vivado,创建一个工程命名为 lab6_2_3. 447 | 2. 创建并添加 Verilog module 以提供所需的功能。 448 | 3. 编写一个测试用例,并验证设计。测试用例输入信号的编写参考下面的波形: 449 | 450 |  451 | 452 | 4. 添加开发板相对应的 XDC 文件,编辑 XDC 文件,加入相关的引脚。注意:你可能需要为你选择的拨码开关的 Clk pin 加入 CLOCK_DEDITCATED_ROUTE 特性(property)。 453 | 5. 综合你的设计并在 Synthesized Design 查看原理图(schematic)。 454 | 6. 实现你的设计。 455 | 7. 生成比特流文件,将其下载到 Nexys4 DDR 开发板,并验证功能。 456 | 457 | #### 参考代码 458 | 459 | ```verilog 460 | module counter_decline( 461 | input Clock, 462 | input Clear, 463 | input Enable, 464 | input Load, 465 | output [3:0] Q 466 | ); 467 | reg [3:0] count; 468 | wire cnt_done; 469 | assign cnt_done = ~ | count; //count是否递减到0 470 | assign Q = count; 471 | always @(posedge Clock) 472 | if (Clear) 473 | count <= 0; 474 | else if (Enable) 475 | if (Load | cnt_done) 476 | count <= 4'b1010; // decimal 10 477 | else 478 | count <= count - 1; 479 | endmodule 480 | ``` 481 | 482 | ## 3. FPGA 工具中的常用电路 483 | 484 | 现在的 Xilinx FPGA 包含了比基本的 LUT,CLB,IOB 和布线更多的资源。与胶合逻辑发明时相比,现在 FPGA 被用来实现更复杂的数字电路。一些复杂的架构资源,例如时钟,必须利用配置和实例化,而不是自己实现。FPGA 工具也提供经常使用的复杂电路,例如 ReedSolomon 译码器,使得开发者不需要“重新设计轮子”。本次实验介绍架构向导,和可以通过 IP 目录获得的 IP 生成工具。 485 | 486 | ### 3-1. 时钟约束向导 487 | 488 | 通过对 FPGA 提供的工具的正确配置和实例化,而不是亲自实现,可以有效的使用专业和高级的架构。所使用的 FPGA 系列不同,所提供的架构的数量和种类也不同。在 Artix-7 系列中,提供了时钟、SelectIO,软错误缓解和 XADC 资源。可以在 IP Catalog 工具的 FPGA Features andDesign 文件夹下访问这些资源。 489 | 490 | 在 Nexys4 DDR 板上,可以使用 100 MHz 时钟源,它连接到 Nexys4 DDR 的 E3 引脚。该时钟源可用于产生多个不同频率和相移的时钟。这是通过使用称为 Artix-7 系列 FPGA 的数字时钟管理器(DCM)和锁相环(PLL)的架构资源来完成的。可以通过双击 IP Catalog 的 FPGA Feature and Design 文件夹的 Clocking 子文件夹下的 Clocking Wizard 条目来调用时钟源生成器。 491 | 492 |  493 | 494 | 该向导可以轻松的为你定制的时钟电路创建源代码封装器。该向导将指导你为时钟原语设置适当的属性,并允许你更改任何向导计算的参数。除了提供用于实现所需时钟电路的 HDL 包装器之外,时钟向导还提供由 Xilinx 时序工具为电路生成的时序参数汇总。该向导的主要功能包括: 495 | 496 | 1. 每个时钟网络最多可接受两个输入时钟和七个输出时钟; 497 | 2. 自动为所选设备选择正确的时钟原语; 498 | 3. 根据用户选择的时钟功能自动配置时钟原语; 499 | 4. 自动实现支持相移和占空比要求的整体配置; 500 | 5. 可选择缓冲时钟信号。 501 | 502 | 时钟生成部件核心的功能如下图: 503 | 504 |  505 | 506 | 假设我们想要生成一个与 100 MHz 输入时钟同相的 5MHz 时钟。请按照以下步骤实现: 507 | 508 | 双击 Clocking Wizard 条目,向导打开后,你会看到有五个选项。 509 | 510 |  511 | 512 | 1. 第一项标题为 Clocking Options。这里有与输入时钟,时钟参数,输入频率和范围相关的参数。由于实际的时钟频率就是 100MHz,所以我们保持默认值就行。 513 | 2. 第二项标题为 Output Clocks。可以设置输出时钟和所需频率相关的参数。设置输出频率为 1.000MHz。**注意:如果频率显示为红色的表明存在错误。**由于此时频率显示为红色,存在错误。将鼠标移到该位置可以看到弹出提示“此设备的实际频率范围为 4.678MHz 至 800MHz”。现将其改为 5.000MHz。在输出时钟中取消勾选 RESET 选项,然后我们创建一个异步复位。 514 | 515 |  516 | 517 | 3. 第三项标题为 Port Renaming,允许你更改端口名。我们将使用默认的端口名。 518 | 4. 第四项标题为 MMCM Setting,用于显示计算设置。只要你知道他们都是做什么的或者它们是怎样影响设计的,你就可以检查并更改他们。我们希望看到时钟是稳定的。 519 | 5. 最后的第五项标题为 Summary,显示你设置的摘要。 520 | 521 | 点击 OK 然后点击 Generate 生成用于综合,实现和仿真的文件。 522 | 523 | 可以通过“IP 源”选项卡访问文件(包括实例化文件)。以下是.veo 文件内容的示例。 524 | 525 | ```verilog 526 | clk_5MHz instance_name 527 | (// Clock in ports 528 | .clk_in1(CLK_IN1), // IN 529 | // Clock out ports 530 | .clk_out1(CLK_OUT1), // OUT 531 | // Status and control signals 532 | .reset(RESET), // IN 533 | .locked(LOCKED)); // OUT 534 | ``` 535 | 536 | #### 实验目的 537 | 538 | 设计一个一秒脉冲发生器。使用时钟向导生成 5MHz 时钟,通过时钟分频器(以行为建模编写)进一步分频,以生成一个以一秒为周期信号。上述使用时钟向导(以及生成的实例化模板)的步骤可用于本练习。使用 100 MHz 的板载时钟源,BTNU 按钮复位电路,SW0 作为使能信号,LED0 作为输出信号,Q 为生成的秒周期信号。LED15 用于输出 DCM 锁定信号。完成设计流程,生成比特流,并将其下载到 Nexys4 DDR 板。验证功能。 539 | 540 | #### 参考代码 541 | 542 | ```verilog 543 | module clk_instance( 544 | input clk100mhz, 545 | input reset, 546 | output reg led 547 | ); 548 | wire clk5mhz; 549 | wire locked; 550 | reg [20:0]counter; 551 | clk_wiz_0 clk_wiz_0(.reset(reset),.clk_in1(clk100mhz),.clk_out1(clk5mhz),.locked(locked)); 552 | always@(posedge clk100mhz or negedge locked)begin 553 | if(~locked)begin 554 | counter <= 0; 555 | end 556 | else if(counter < 500000) begin 557 | counter <= counter + 1; 558 | end 559 | else begin 560 | counter <= 0; 561 | led <= ~led; 562 | end 563 | end 564 | endmodule 565 | ``` 566 | 567 | ### 3-2. IP 目录 568 | 569 | Vivado 工具的 IP 目录允许你配置和生成各种功能的核。在 IP 目录中,根据核心功能进行分组,这些核心包括从简单的基本核(如加法器)到非常复杂的和(如 MicroBlaze 处理器)。它还涵盖了从汽车到图像处理等各个领域所需核。配置和生成核心的过程与架构向导类似。核心将根据需要使用各种资源,包括 LUT,CLB,DSP48,BRAM 等。让我们看看如何配置和生成计数器核。二进制计数器核可以通过双击位于 IP catalog 下的 Basic Elements 分支下的 Counters 子文件夹下的 Binary Counter 来开始生成。 570 | 571 |  572 | 573 | 调用时,您将看到两个项配置。第一项标题为 Basic,其上的核心配置参数包括:Implement Using: Fabric or DSP48Output WidthIncrement Value Loadable, Restrict Count, Count Mode (Up, Down, UPDPWN),Threshold 574 | 第二项标题为 Control,配置参数包括:Synchronous Clear, Clock Enable and various other settings.设计人员可以选择想要的功能然后点击 OK 来生成 IP 核。 575 | 576 | #### 实验目的 577 | 578 | 使用 IP 目录生成一个简单的 4 位计数器内核,从 0 计数到 9(提示:配置计数器核时使用 Threshold output)将其实例化两次以创建已创建一个两位数的 BCD 计数器,每秒计数一次。利用架构向导生成一个 5MHz 的时钟,然后使用行为建模生成 1Hz 的周期信号来驱动计数器。将结果显示在两个 7 段数码管上。设计的输入使用 100MHz 的时钟源,使用 BTNU 按钮作为复位信号,使用 SW0 作为使能信号。使用 Basys3 或 Nexys4 DDR 板验证硬件设计功能。 579 | -------------------------------------------------------------------------------- /docs/doc_finite_state_machine.md: -------------------------------------------------------------------------------- 1 | # 有限状态机 2 | 3 | ## 有限状态机简介 4 | 5 | 有限状态机 (FSM) 是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM 的实例包括控制单元和时序。本实验介绍了两种类型的 FSM(Mealy 和 Moore)的概念,以及开发此类状态机的建模方式。请参阅 Vivado 教程,了解如何使用 Vivado 工具创建项目和验证数字电路。 6 | 7 | ## 实验目标 8 | 9 | 在本次实验中,你将会学到: 10 | 11 | - 对 Mealy FSMs 建模 12 | - 对 Moore FSMs 建模 13 | 14 | ## Mealy FSM(米利型有限状态机) 15 | 16 | 有限状态机(FSM)或称简单状态机用于设计计算机程序和时序逻辑电路。它被设想为抽象机器,可以处于有限数量的用户定义状态之一。机器一次只能处于一种状态; 它在任何给定时间所处的状态称为当前状态。当由触发事件或条件启动时,它可以从一种状态改变为另一种状态; 这称为过渡。特定 FSM 由其状态列表和每个转换的触发条件定义。 17 | 在现代社会中的许多设备中可以观察到状态机的踪影,这些设备根据发生的事件序列执行预定的动作序列。简单的例子是自动售货机,当存放硬币的金额达到商品价格时分配产品;电梯在把乘客送达楼上后才会下降;交通灯按一定的时间改变信号来控制车流;以及需要输入一串正确的数字才能打开的组合锁。 18 | 状态机使用两种基本类型建模--Mealy 和 Moore。在 Mealy 机器中,输出取决于当前状态和当前输入。在 Moore 机器中,输出仅取决于当前状态。 19 | Mealy 型状态机的一般模型由组合过程电路和状态寄存器组成,组合过程电路生成输出和下一个状态,状态寄存器保存当前状态,如下图所示。状态寄存器通常建模为 D 触发器。状态寄存器必须对时钟边缘敏感。其他块可以使用 always 过程块或 always 过程块和 dataflow 建模语句的混合来建模;always 过程块必须对所有输入敏感,并且必须为每个分支定义所有输出,以便将其建模为组合块。两段式 Mealy 机器可以表示为 20 | 21 |  22 | 23 | 下面是奇偶校验校验机的状态图和相关模型: 24 | 25 |  26 | 27 | ```verilog 28 | module mealy_2processes(input clk, input reset, input x, output reg parity); reg state, nextstate; 29 | parameter S0=0, S1=1; 30 | always @(posedge clk or posedge reset) // always block to update state if (reset) 31 | state <= S0; 32 | else 33 | state <= nextstate; 34 | 35 | always @(state or x) // always block to compute both output & nextstate begin 36 | parity = 1'b0; case(state) 37 | S0: if(x) 38 | begin 39 | parity = 1; nextstate = S1; 40 | end else 41 | nextstate = S0; 42 | S1: if(x) 43 | nextstate = S0; 44 | else begin 45 | parity = 1; nextstate = S1; 46 | 47 | end 48 | 49 | end default: 50 | nextstate = S0; endcase 51 | 52 | endmodule 53 | ``` 54 | 55 | 三段式 Mealy 机器的图示及其建模如下: 56 | 57 |  58 | 59 | ```verilog 60 | module mealy_3processes(input clk, input reset, input x, output reg parity); reg state, nextstate; 61 | parameter S0=0, S1=1; 62 | always @(posedge clk or posedge reset) // always block to update state if (reset) 63 | state <= S0; 64 | else 65 | state <= nextstate; 66 | always @(state or x) // always block to compute output begin 67 | parity = 1'b0; case(state) 68 | S0: if(x) 69 | parity = 1; S1: if(!x) 70 | parity = 1; 71 | endcase end 72 | always @(state or x) // always block to compute nextstate begin 73 | nextstate = S0; case(state) 74 | S0: if(x) 75 | nextstate = S1; S1: if(!x) 76 | nextstate = S1; endcase 77 | end endmodule 78 | ``` 79 | 80 | 状态分配可以使用独热码(one – hot code),二进制编码,格雷码以及其他编码。通常,综合工具将确定状态分配的编码,但用户也可以通过更改综合属性来强制特定编码,如下所示。状态分配编码将对状态寄存器中使用的位数产生影响;独热编码使用最多的位数,但解码非常快,二进制编码使用最少的位数,但解码较长。 81 | 82 |  83 | 84 | ## 使用三段式 Mealy 状态机的实现一个序列检测器 85 | 86 | ### 实验要求 87 | 88 | Mealy 状态机有一个输入(ain)和一个输出(yout)。当且仅当接收到的 1 的总数可被 3 整除时,输出为 1(提示:0 也算被 3 整除,但是,在复位周期中不把计数器归为 0,复位信号过后把计数器归 0——参考模拟波形时间= 200。设计一个 testbench 并通过 behavioral simulation 验证模型。使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。完成设计流程,生成比特流,并将其下载到 Basys3 或 Nexys4 DDR 板。验证功能。 89 | 90 | ### 实验步骤 91 | 92 | 1. 打开 Vivado 并创建一个空工程并命名为 lab10_1。 93 | 94 | 2. 创建并添加使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。 95 | 96 | 3. 编写仿真文件来验证代码的正确 97 | 98 | 4. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚,使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。 99 | 100 | 5. 综合,实现设计。 101 | 102 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 103 | 104 | ### 参考代码和分析 105 | 106 | ```verilog 107 | module lab10_1( 108 | input clk, 109 | input rst, 110 | input ain, 111 | output reg [3:0]count, 112 | output reg yout 113 | ); 114 | parameter s0=0, s1=1,s2=2; 115 | reg [1:0]state,nextstate; 116 | always@(posedge clk or posedge rst) 117 | begin 118 | if(rst) 119 | begin 120 | state<=s0; 121 | count<=4'b0; 122 | end 123 | else 124 | begin 125 | state<=nextstate; 126 | if(ain) 127 | count<=count+1; 128 | end 129 | end 130 | 131 | always@(*) 132 | begin 133 | yout=0; 134 | case(state) 135 | s0:if(!ain) 136 | yout=1; 137 | s2:if(ain) 138 | yout=1; 139 | endcase 140 | end 141 | 142 | always@(*) 143 | begin 144 | case(state) 145 | s0:if(ain) 146 | nextstate=s1; 147 | else 148 | nextstate=s0; 149 | s1:if(ain) 150 | nextstate=s2; 151 | else 152 | nextstate=s1; 153 | s2:if(ain) 154 | nextstate=s0; 155 | else 156 | nextstate=s2; 157 | endcase 158 | end 159 | endmodule 160 | ``` 161 | 162 | 米利型的输出是和当前状态以及输入都相关的,所以这里是这样的情况。但是如果是摩尔型的话输入只与当前状态相关,之后也会有介绍。 163 | 164 | ## Moore FSM(摩尔型有限状态机) 165 | 166 | Moore 型有限状态机的一般模型如下所示。其输出由状态寄存器块生成。使用当前输入和当前状态确定下一状态。这里的状态寄存器也使用 D 触发器建模。通常,Moore 机器使用三个块来描述,其中一个块必须是顺序的,另外两个块可以使用 always 块或 always 和 dataflow 建模结构的组合来建模。 167 | 168 |  169 | 170 | 171 | 以下是使用 Moore 型有限状态机实现的奇偶校验器的状态图。与之关联模型如下所示。 172 | 173 |  174 | 175 | ```verilog 176 | module moore_3processes(input clk, input reset, input x, output reg parity); reg state, nextstate; 177 | parameter S0=0, S1=1; 178 | always @(posedge clk or posedge reset) // always block to update state if (reset) 179 | state <= S0; 180 | else 181 | state <= nextstate; 182 | 183 | always @(state) // always block to compute output begin 184 | case(state) 185 | S0: parity = 0; S1: parity = 1; 186 | endcase 187 | end 188 | always @(state or x) // always block to compute nextstate begin 189 | nextstate = S0; case(state) 190 | S0: if(x) 191 | nextstate = S1; S1: if(!x) 192 | nextstate = S1; 193 | endcase 194 | end 195 | endmodule 196 | ``` 197 | 198 | 在本例中,输出块很简单,可以使用 dataflow 建模构造进行建模。可以使用以下代码代替 always 块。您还需要将输出类型从 reg 更改为 wire。 199 | 200 | ```verilog 201 | assign parity = (state==S0) ? 1'b0: 1'b1; 202 | ``` 203 | 204 | ## 使用三段式 Moore 状态机的实现一个序列检测器 205 | 206 | ### 实验要求 207 | 208 | Moore 状态机有一个输入(ain)和一个输出(yout)。当且仅当接收到的 1 的总数可被 3 整除时,输出为 1(提示:0 也算被 3 整除,但是,在复位周期中不把计数器归为 0,复位信号过后把计数器归 0——参考模拟波形时间= 200。设计一个 testbench 并通过 behavioral simulation 验证模型。使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。完成设计流程,生成比特流,并将其下载到 Basys3 或 Nexys4 DDR 板。验证功能。 209 | 210 | ### 实验步骤 211 | 212 | 1. 打开 Vivado 并创建一个空工程并命名为 lab10_2。 213 | 214 | 2. 创建并添加使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。 215 | 216 | 3. 编写仿真文件来验证代码的正确 217 | 218 | 4. 在工程中添加适当的管脚约束的 XDC 文件,并加入相关联的管脚,使用 SW15 作为时钟输入,SW0 作为输入,BTNU 按钮作为电路的复位输入,LED7:LED4 上的 1s 计数和作为 yout 输出的 LED0。 219 | 220 | 5. 综合,实现设计。 221 | 222 | 6. 生成比特流文件,下载到 Nexys4 开发板上,验证功能。 223 | 224 | ### 参考代码和分析 225 | 226 | ```verilog 227 | module lab10_2( 228 | input clk, 229 | input rst, 230 | input ain, 231 | output reg [3:0]count, 232 | output reg yout 233 | ); 234 | parameter s0=0, s1=1,s2=2; 235 | reg [1:0]state,nextstate; 236 | always@(posedge clk or posedge rst) 237 | begin 238 | if(rst) 239 | begin 240 | state<=s0; 241 | count<=4'b0; 242 | end 243 | else 244 | begin 245 | state<=nextstate; 246 | if(ain) 247 | count<=count+1; 248 | end 249 | end 250 | always@(*) 251 | begin 252 | case(state) 253 | s0:yout=1; 254 | default:yout=0; 255 | endcase 256 | end 257 | always@(*) 258 | begin 259 | case(state) 260 | s0:if(ain) 261 | nextstate=s1; 262 | else 263 | nextstate=s0; 264 | s1:if(ain) 265 | nextstate=s2; 266 | else 267 | nextstate=s1; 268 | s2:if(ain) 269 | nextstate=s0; 270 | else 271 | nextstate=s2; 272 | endcase 273 | end 274 | endmodule 275 | ``` 276 | 277 | 摩尔型相较米利型输出的状态只与输入相关 278 | 279 | ## 扩展实验内容 280 | 281 | ### 扩展实验 1 282 | 283 | 使用三段式 Moore 状态机或者 Mealy 状态机实现一个序列检测器。 284 | 285 | Moore 状态机有两个输入(`ain [1:0]`)和一个输出(`yout`)。除非出现以下输入序列之一,否则输出将从 0 开始并保持为常量值: 286 | 287 | 1. 输入序列 `ain [1:0] = 01,00` 使输出变为 0 288 | 2. 输入序列 `ain [1:0] = 11,00` 使输出变为 1 289 | 3. 输入序列 `ain [1:0] = 10,00` 使输出切换。 290 | 291 | #### 实验要求 292 | 293 | 打开 Vivado 并创建一个空工程并命名为 lab10_kuozhan1。设计一个 testbench(类似于下面显示的波形)并通过 behavioral simulation 验证模型。使用 SW15 作为时钟输入,SW1-SW0 作为 ain [1:0]输入,BTNU 按钮作为电路的复位输入,LED0 作为 yout 输出。完成设计流程,生成比特流,并将其下载到 Basys3 或 Nexys4 DDR 板。验证功能。 294 | 仿真示意图如下: 295 | 296 |  297 | 298 | ### 扩展实验 2 299 | 300 | 使用 ROM 设计一个特定的计数计数器(下面列出的计数序列)来开发一个 Mealy 状态机。 301 | 302 | #### 实验要求 303 | 304 | 打开 Vivado 并创建一个空工程并命名为 lab10_kuozhan2。设计一个 testbench 并通过 behavioral simulation 验证模型。使用 SW15 作为时钟输入,BTNU 按钮作为电路的复位输入,LED2:LED0 作为计数器的计数输出。完成设计流程,生成比特流,并将其下载到 Basys3 或 Nexys4 DDR 板。验证功能。 305 | 306 | 计数序列是:000, 001, 011, 101, 111, 010 (repeat) 000, … 307 | 308 |  309 | 310 | ## 总结 311 | 312 | 在这个实验中,您学习了 Mealy 和 Moore 状态机建模方法。还设计并实现了序列检测器、序列生成器和编码转换器,实践了两段和三段式的状态机。 313 | -------------------------------------------------------------------------------- /docs/doc_fpga.md: -------------------------------------------------------------------------------- 1 | # FPGA 基础知识介绍 2 | 3 | FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在 PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 4 | 5 | 目前 FPGA 的两大主要厂商为 xilinx 和 altera。 6 | 7 | Xilinx:公司网址为:[www.xilinx.com](https://www.xilinx.com/)。FPGA 市场的龙头老大,市场份额接近 50%,其主要产品包括:Sparten 系列、Virtex 系列、Artix 系列、Kintex 系列、Virtex 系列等 8 | 9 | 开发工具:其第六代及以前的产品的开发工具为 ISE,从第七代产品开始,已全部转移到 vivado 平台。 10 | 11 | Altera:公司网址为:[www.altera.com](https://www.altera.com/),FPGA 市场的二当家,市场份额 40% 以上,2015 年 6 月被 Intel 以 167 亿美元收购。主要产品包含:Max 系列、Cyclone 系列、Arria 系列、Stratix 系列等。主要开发工具:Quartus 12 | 13 | 此外,Lattice、Actel、Atmel 等公司也有 FPGA 产品,由于市场份额小,市面上很少见到,此处不再介绍。 14 | 15 | FPGA 产品种类多种多样,但原理都是相同的。我们只要理解了其基本结构,学习起来还是非常轻松的。 16 | 17 | 在介绍 FPGA 之前,先对数字电路中所学的知识做一个简单的回顾。 18 | 19 | 现如今的集成电路绝大部分采用 CMOS 工艺,CMOS 电路是互补型金属氧化物半导体电路 (Complementary Metal-Oxide-Semiconductor) 的英文字头缩写,它由绝缘场效应晶体管组成,由于只有一种载流子,因而是一种单极型晶体管集成电路,其基本结构是一个 N 沟道 MOS 管和一个 P 沟道 MOS 管。NMOS 和 PMOS 可以认为是两种开关电路,两种电路均包含 G(栅极)、D(漏极)、S(源极)三个极: 20 | 21 | 对于 NMOS,当 G 为高电平时,D、S 导通,否则截止 22 | 23 | 对于 PMOS,当 G 为低电平时,D、S 导通,否则截止 24 | 25 |  26 | 27 | 一个 NMOS 和一个 PMOS 可构成一个 CMOS 反相器: 28 | 29 | vi 为高电平时,PMOS 截止,NMOS 导通,vo 输出低电平 30 | 31 | vi 为低电平时,PMOS 导通,NMOS 截止,vo 输出高电平 32 | 33 |  34 | 35 | 其逻辑表达式可写成: 36 | 37 |  38 | 39 | 同理,可构成 CMOS 的与非门、或非门 40 | 41 |  42 | 43 | 通过非门、与非门、或非门可实现所有的组合逻辑电路,多个与非门可组成一个带有复位、置位功能的 D 触发器,而 D 触发器则是时序逻辑电路的最核心部件。 44 | 45 |  46 | 47 | 由此可知,通过非门、与非门、或非门的有序堆叠,可实现任意功能的数字电路,如果有一款电路,其基本单元可配置成各种基本门,则其就具备了硬件编程能力。FPGA 就是这种芯片,它基于查找表(LUT:Look Up Table)技术的可编程逻辑器件,通过配置,LUT 可实现与门、或门、与非门、或非门或者其他简单组合逻辑功能,其本质上就是 1bit 位宽的 RAM 48 | 49 | 我们以一个 2 输入的查找表为例,来做讲解 50 | 51 |  52 | 53 | 以目前比较流行的 Spartan6 芯片为例,来说明 54 | 55 | 其最底层便是一个 6 输入查找表(可拆成两个 5 输入 LUT 使用)以及两个 D 触发器的结构 56 | 57 |  58 | 59 | Slice 是 Xilinx FPGA 的最基本单元,包含 4 个 6 输入 LUT 及 8 个 D 触发器 60 | 61 | Xilinx 的 FPGA 中包含三类 Slice:SliceL、SliceM、SliceX,三类 slice 本质上是相同的,只不过在细节上有一些差别,此处不再详细展开。 62 | 63 |  64 | 65 | CLB(Configurable Logic Blocks)是 Sparten6 的主要资源,包含两个 Slice,如下图所示: 66 | 67 |  68 | 69 | 多个 CLB 再加上丰富的互联开关,便构成了 Xilinx 公司 FPGA 的最核心框架。 70 | 71 | 下图是 xilinx 一款型号为 XC6SLC45T 的 FPGA 在 planAhead 中的视图 72 | 73 |  74 | 75 | 从图中可以看出,FPGA 内部,除了大量的 CLB 资源,用于实现可编程逻辑外,还有一些其它的硬件资源,包括 block ram、内存控制器、时钟管理(CMT)单元、数字信号处理(DSP)端口控制(IOB)单元等,大大提高了其可编程性,几乎可以实现所有的数字电路功能。 76 | 77 | 下面是在 planahead 中对 xc6slx4-2tqg144 芯片的截图,通过这些图片,可以对其结构有一个整体的了解。更多的细节性问题,需要大家在实际使用过程中逐步掌握。 78 | 79 |  80 | 81 | 输入输出块,包含了焊盘及其相关电路 82 | 83 |  84 | 85 | ILOGIC、OLOGIC、IODELAY 部分 86 | 87 |  88 | 89 | Slice 90 | 91 |  92 | 93 | Slice 94 | 95 |  96 | 97 | Block RAM 资源 98 | 99 |  100 | 101 | 时钟管理单元 102 | 103 |  104 | 105 | 时钟驱动电路 106 | 107 |  108 | 109 | FPGA 依靠其强大、全方面、多维度的可编程能力,在航空航天、电子通信、银行金融、医疗设备、信息存储、数据处理、ASIC 原型验证等许多行业或领域发挥着极其重要的作用 110 | -------------------------------------------------------------------------------- /docs/doc_logisim.md: -------------------------------------------------------------------------------- 1 | # LogiSim 工具 2 | 3 | ## LogiSim 简介 4 | 5 | Logisim 是一种用于设计和模拟数字逻辑电路的教育工具。凭借其简单的工具栏界面和构建它们时的电路仿真,它非常简单,有助于学习与逻辑电路相关的最基本概念。由于能够从较小的子电路构建更大的电路,并通过鼠标拖动来绘制电线束,因此可以使用 Logisim 来设计和仿真用于相关课程的教学目的。 6 | 7 | ## LogiSim 下载 8 | 9 | 可以通过 Logisim 的官网下载适合你机器的 Logisim 的软件,启动 Logisim 应用程序。[下载网址](http://www.cburch.com/logisim/download.html) 10 | 11 | ## LogiSim 使用简介 12 | 13 | ### LogiSim 初次启动 14 | 15 | 您启动 Logisim 时,您将看到类似于以下内容的窗口。由于您可能使用的系统与我的不同,因此某些细节可能略有不同。 16 | 17 |  18 | 19 | 所有 Logisim 分为三个部分,称为资源管理器窗格,属性表和 画布。上面这些部分是菜单栏和工具栏。 20 | 21 |  22 | 23 | 我们可以快速处理资源管理器窗格和属性表。此外,菜单栏不言自明。 24 | 这留下了工具栏和画布。画布是你画电路的地方; 并且工具栏包含您将用于完成此任务的工具。 25 | 26 | ### 示例(制作一个异或门) 27 | 28 | 由数电课本上的知识我们可以得知,异或门的电路大致如下图: 29 | 30 |  31 | 32 | 我建议首先将门插入一种骨架,然后再用线连接它们来建立一个电路。我们要做的第一件事就是添加两个 AND 门。单击工具栏中的 AND 工具 (列出倒数第二个工具)。然后在编辑区域中单击您想要第一个 AND 门的位置。一定要为左边的东西留出足够的空间。然后再次单击 AND 工具并将第二个 AND 门置于其下方。 33 | 34 |  35 | 36 | 注意 AND 门左侧的五个点。这些是可以连接电线的点。碰巧我们只将其中两个用于我们的 XOR 电路; 但对于其他电路,您可能会发现有两条以上的电线连接到 AND 门是有用的。 37 | 现在添加其他门。首先单击 OR 工具( ); 然后单击您想要的位置。并使用 NOT 工具( )将两个 NOT 门放入画布。 38 | 我在 NOT 门和 AND 门之间留了一点空间; 但是,如果你愿意的话,你可以将它们相互对立,并节省你以后用电线连接它们的努力。 39 | 现在我们要将两个输入 x 和 y 添加到图中。选择输入工具( ),然后放下引脚。您还应该使用输出工具( )在 OR 门的输出旁边放置一个输出引脚。(同样,我在 OR 门和输出引脚之间留下一点空间,但您可以选择将它们放在彼此旁边。)  40 | 如果您决定不喜欢放置内容的位置,则可以使用编辑工具( )将其选中并将其拖动到所需位置。或者,您可以通过从“编辑”菜单中选择“删除”或按 Delete 键将其完全删除。 41 | 当您放置电路的每个组件时,您会注意到,只要放置组件,Logisim 就会恢复到编辑工具,以便您可以移动最近放置的组件或(我们很快就会看到)连接组件通过创建电线给他人。如果要添加最近放置的组件的副本,则快捷方式是按 Control-D 复制选择。(某些计算机使用其他键作为菜单,例如 Macintoshes 上的 Command 键。您可以使用 D 键按下该键。) 42 | 在画布上阻止所有组件后,您就可以开始添加电线了。选择编辑工具( )。当光标位于接收导线的点上方时,将在其周围绘制一个小的绿色圆圈。在那里按下鼠标按钮并尽可能地拖动电线。 43 | 添加电线时 Logisim 非常智能:每当电线在另一根电线上结束时,Logisim 会自动连接它们。您还可以使用编辑工具拖动其中一个端点来“扩展”或“缩短”导线。 44 | Logisim 中的电线必须是水平或垂直的。为了将上输入连接到 NOT 门和 AND 门,我添加了三条不同的线。 45 | 46 |  47 | 48 | Logisim 自动将电线连接到门和彼此。这包括如上所述在 T 交叉点自动绘制圆,表示导线已连接。 49 | 在绘制电线时,您可能会看到一些蓝色或灰色电线。
Logisim 中的蓝色表示该点的值为“未知”,灰色表示该线未连接任何东西。当你正在建造一个电路时,这不是什么大问题。但是当你完成它时,你的电线都不应该是蓝色或灰色。(OR 门的未连接腿仍然是蓝色的:没关系。)
50 | 如果你认为一切都应该连接后你有蓝色或灰色线,那么就会出现问题。将电线连接到正确的位置非常重要。Logisim 在组件上绘制小点以指示电线应该连接的位置。当你继续,你会看到点从蓝色变为浅色或深绿色。 51 | 连接好所有电线后,插入的所有电线本身都会呈浅绿色或深绿色。 52 | 我们的最后一步是测试我们的电路,以确保它真正做到我们想要的。Logisim 已经在模拟电路了。让我们再看看我们在哪里。 53 | 54 |  55 | 56 | 注意,输入引脚都包含 0; 输出引脚也是如此。这已经告诉我们,当两个输入都为 0 时,电路已经计算出 0。 57 | 现在尝试另一种输入组合。选择戳工具小手图案( )并通过单击它们开始戳输入。每次你戳一个输入,它的值将切换。例如,我们可能会首先查看底部输入。 58 | 59 |  60 | 61 | 当您更改输入值时,Logisim 将向您显示哪些值沿着导线向下移动,方法是将它们指示为绿色以指示 1 值或将深绿色(几乎为黑色)指示为 0 值。您还可以看到输出值已更改为 1。 62 | 到目前为止,我们已经测试了真值表的前两行,输出(0 和 1)与所需的输出相匹配。 63 | 64 |  65 | 66 | 通过不同的组合戳开关,我们可以验证其他两行。如果他们都匹配,那么我们就完成了:电路工作! 67 | 要归档已完成的工作,您可能需要保存或打印电路。文件菜单允许这样,当然它也允许您退出 Logisim。但为什么现在退出? 68 | 现在您已经完成了教程,您可以通过构建自己的电路来试验 Logisim。如果您想构建具有更复杂功能的电路,那么您应该浏览帮助系统的其余部分,看看您还能做些什么。Logisim 是一个功能强大的程序,允许您构建和测试大型电路; 这个一步一步的过程只是划伤了表面。 69 | 70 | ### 输入个数设置 71 | 72 | 在一个电路中,logisim 默认一个门支持有五个输入,但是我们同样也可以调整输入个数的数量,点击一个门查看他的属性,并修改输入个数: 73 | 74 |  75 | 76 | 在异或门中,我们可以把这个输入的个数改为 2 个。 77 | 78 | ### 位宽设置 79 | 80 | 电路中每个元件的每个输入和输出都有一个与之相关的位宽。通常位宽为 1,并且无法改变它,但 Logisim 的许多内置组件都包含允许您自定义其输入和输出的位宽的属性。 81 | 下面的屏幕截图显示了一个简单的电路,用于查找两个三位输入的按位 AND。注意三位输出是两个输入的按位 AND。所有组件都经过自定义,可通过其 Data Bits 属性处理三位数据; 屏幕截图显示 AND 门属性,包括 3 的 Data Bits 属性。 82 | 83 |  84 | 85 | Logisim 中的所有组件都为每个输入和输出定义了一个位宽。相反,导线的位宽未定义:相反,导线的宽度适应其所连接的组件。如果导线连接两个要求不同位宽的组件,Logisim 会抱怨“不兼容的宽度”并以橙色表示有问题的位置。在下面,输出引脚的数据位属性已更改为 1,因此 Logisim 抱怨线路无法将三位值连接到一位值。 86 | 87 |  88 | 89 | 连接不兼容位置的电线(以橙色绘制)不带值。 90 | 91 | 对于单比特电线,您可以一目了然地看到电线带有什么价值,因为 Logisim 根据值对电线颜色或深绿色进行着色。它不显示多位线的值:它们只是黑色。但是,您可以使用戳工具( )单击它来探测导线。 92 | 93 |  94 | 95 | 此探测功能有助于使用线束调试电路。 96 | 97 | ### 创建子电路 98 | 99 | #### 创建电路 100 | 101 | 每个 Logisim 项目实际上都是一个电路库。在最简单的形式中,每个项目只有一个电路(默认情况下称为“main”),但很容易添加更多:从“项目”菜单中选择“添加电路...”,然后为新电路键入您喜欢的任何名称想要创造。 102 | 假设我们要构建一个名为“2:1 MUX”的 2 对 1 多路复用器。添加电路后,Logisim 将如下所示。 103 | 104 | 在资源管理器窗格中,您现在可以看到项目现在包含两个电路,“main”和“2:1 MUX”。Logisim 在当前正在观看的电路图标上绘制放大镜; 当前电路名称也出现在窗口的标题栏中。 105 | 编辑电路后看起来像 2:1 多路复用器,我们可能会得到以下电路。 106 | 107 |  108 | 109 | #### 使用子电路 110 | 111 | 现在假设我们想要使用 2 对 1 多路复用器的实例构建 4 对 1 多路复用器。当然,我们首先会创建一个新电路,我们将其称为“4:1 MUX”。要增加 2 到 1 多路复用器到我们的电路中,我们点击 2:1 多路复用器电路,一旦在资源管理器窗格中选择它作为一个工具,那么我们可以通过画面内点击添加它的副本,表示为框。 112 | 113 | 如果要双击资源管理器窗格中的 2:1 MUX 电路,则窗口将切换为编辑 2:1 MUX 电路。 114 | 在构建电路之后,我们最终得到以下结果。 115 | 116 | 我们用于 4 对 1 多路复用器的电路使用 3 对 2 对 1 多路复用器,每个多路复用器都绘制成一个带有引脚的盒子。此框上的引脚对应于 2:1 MUX 电路中的输入和输出引脚。盒子西侧的两个引脚对应于 2:1 MUX 电路中面向东的两个引脚; 盒子东侧的引脚对应于 2:1 MUX 的朝西引脚(恰好是输出引脚); 盒子南侧的针脚对应于 2:1 MUX 的朝北针脚。盒子西侧的两个引脚的顺序对应于子电路设计中的自上而下的顺序。(如果盒子的北侧或南侧有多个引脚,它们将对应于子电路中相同的左右顺序。) 117 | 118 | 如果子电路布局中的引脚具有与之关联的标签,则 当用户将鼠标悬停在子电路组件的相应位置上时,Logisim 将在尖端(即临时文本框)中显示该标签。(如果您发现这些提示很烦人,可以通过“首选项”窗口的“布局”选项卡禁用它们。) 119 | 120 |  121 | 122 | ### 编辑子电路外观 123 | 124 | #### 默认外观 125 | 126 | 默认情况下,当子电路放置在较大的电路中时,它被绘制为一个矩形,其中一个凹口表示子电路布局的北端。引脚将根据它们的面向放置在矩形的边框上:布局中朝东的引脚(通常出现在布局的西侧)将放置在矩形的西侧,根据其自上而下的排序布局。根据布局中从左到右的顺序,布局中朝南的引脚(通常朝向布局的北侧)将放置在矩形的北侧。 127 | 默认矩形可以选择包含一些将出现在矩形中间的字母。要指定此项,请选择选择工具( )并单击电路布局的背景。这将显示属性表中的电路属性,包括共享标签,共享标签面和共享标签字体属性。共享标签属性的值将绘制在矩形的中心; “共享标签面”属性可自定义文本的绘制方向,当然“共享标签字体”属性可自定义使用的字体。 128 | 129 | #### 定制外观 130 | 131 | 默认外观非常实用,Logisim 确实存在多年,没有其他选择。但是,如果您希望以不同方式绘制子电路,可以从“项目”菜单中选择“编辑电路外观”,Logisim 的界面将从其常规布局编辑界面切换到用于绘制电路外观的界面。(您也可以单击 资源管理器窗格上方工具栏中的最右侧图标。)下面,我们正在编辑 2:1 多路复用器的外观,以便使用通常的梯形而不是矩形绘制。 132 | 133 |  134 | 135 | 对于如上所示绘制的 2:1 多路复用器的外观,4:1 多路复用器的布局将如下所示。 136 | 137 |  138 | 139 | 外观编辑器就像传统的绘图程序,但是有一些特殊符号用于指示绘图在放置到电路布局时的工作方式。无法删除这些特殊符号。 140 | 绿色圆圈有一条线从它出来,我们称之为锚。每个子电路外观中只有一个锚点。电路中的每个元件都有一个标识其位置的点; 用户在创建新组件时会看到这一点:鼠标单击只标识一个位置,组件相对于该位置放置(通常在鼠标位置具有主输出)锚点标识鼠标相对于整个绘图的位置子电路已创建。 141 | 锚也标识外观的面向,如锚点的线指向其圆的方向所示。将子电路放入布局时,用户可以改变子电路的面向; 锚的面向指示外观朝向的方向。在我们的示例中,锚点朝向东方,4:1 多路复用器中的每个子电路实例也面向东方,因此它们都以与 2:1 多路复用器外观相同的方向绘制。 142 | 带有圆点的蓝色圆圈和正方形是子电路的 端口。电路中的输入和输出引脚数量与端口数一样多。对应于输入的端口绘制为正方形,而对应于输出的端口绘制为圆形。每个端口指示连接到电路的导线如何与布局中的输入或输出引脚相对应。 143 | 当您选择一个端口时,Logisim 将通过在窗口右下角弹出布局的微型图表来指示相应的引脚,相应的引脚用蓝色绘制。选择所有端口时不会发生这种情况。 144 | 工具栏包含用于添加其他形状的工具,如下所示,其中包含 shift 和 alt 键如何修改工具行为的说明。此外,在按下控制键的情况下单击或拖动鼠标会将鼠标位置捕捉到最近的网格点。 145 | 146 |  147 | 148 | ## 参考文献 149 | 150 | - [LogiSim 用户手册](http://www.doc88.com/p-1466403426738.html) 151 | - [配置 Java 环境变量](https://www.cnblogs.com/cnwutianhao/p/5487758.html) 152 | -------------------------------------------------------------------------------- /docs/doc_nexys.md: -------------------------------------------------------------------------------- 1 | # 常用外设原理介绍 2 | 3 | 下面对一些常见外设进行介绍 4 | 5 | ### LED 6 | 7 | LED 灯,又称 LED 发光二极管,原理图如下所示 8 | 9 |  10 | 11 | LED 发光二极管有 P、N 两极,具有普通二极管的单向导电性,当 P 极电压高于 N 极电压,且达到一定阈值之后(一般为 0.7V,与其材质有关),二极管开始导通,并开始发光。反之,二极管无法导通,不会发光。由于 LED 灯导通后电阻几乎为零,应此在实际使用过程中往往会串接上一个 1~10K 左右的电阻,以达到限流的作用。一般来说,发光二极管的工作电流在 10mA 左右,可根据电源电压、LED 压降、工作电流计算出串接电阻的阻值大小。 12 | 13 | 实际电路中有两种连接方式:1,N 极接地,P 极通过一个电阻后与控制端相连。2,P 极通过串接电阻后与电源相连,N 极作为控制端。如下所示 14 | 15 |  16 | 17 | 以方式 1 为例来说,当控制端输出电压为高电平时,LED 灯亮;当控制端输出电压为低电平时,LED 灯灭。第二种情况与此类似,不再赘述。 18 | 19 | ### 拨动开关 20 | 21 | 拨动开关是一种比较简单的输入设备,一般具有两个档位,实物图如下所示 22 | 23 |  24 | 25 | 其使用方式如下图所示 26 | 27 |  28 | 29 | 将 1 与地相连,3 与电源相连,2 通过一串接电阻后作为输入端。当拨动开关处于 1、2 短接的档位时,输入端为低电平;拨动开关处于 2、3 短接的档位时,输入端为高电平。因此,通过改变拨动开关的档位,便可以控制输入端的高低电平。 30 | 31 | ### 独立按键 32 | 33 | 按键是另外一种比较常见的输入设备,其外形多种多样,但工作方式基本相同。 34 | 35 |  36 | 37 | 如上图所示的四脚按键,其内部两两相连。原理图如下所示 38 | 39 |  40 | 41 | 按键默认状态时 1、3 短接,2、4 短接,按键按下后,1、2、3、4 全部短接在一起。一种用法如下所示 42 | 43 |  44 | 45 | 其中串接的两个电阻均为 10K,按键按下时,输入端为高电平;松开后,输入端为低电平。此种连接方式下,输入端的默认电平为低电平。 46 | 47 | 还有一种连接方式,如下图所示,输入端的默认电平为高电平,此种连接方式常用于一些低电平有效的信号输入,如复位信号等。对于复位信号来说,电容的存在可以使得系统在刚刚上电时,输入端保持一定时间的低电平,从而达到上电复位的目的,复位时间的长短由电阻及电容共同决定。 48 | 49 |  50 | 51 | 此外,还有一种自锁式的按键开关,在开关按钮第一次按时,开关接通并保持,即自锁,在开关按钮第二次按时,开关断开,同时开关按钮弹出来。自锁式按键的功能与拨动开关基本相同,此处不再详细说明。 52 | 53 | ### 七段数码管 54 | 55 | 我们最常用的是七段式和八段式 LED 数码管,八段比七段多了一个小数点,其他基本相同。 56 | 57 |  58 | 59 | 所谓的八段就是指数码管里有八个小 LED 发光二极管,通过控制不同的 LED 的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个 LED 的阴极连在一起,让其接地,这样给任何一个 LED 的另一端高电平,它便能点亮。而共阳极就是将八个 LED 的阳极连在一起。其原理图如下。 60 | 61 |  62 | 63 |  64 | 65 |  66 | 67 | 其中引脚图的两个 COM 端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即 a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的 8 段,对应一个字节的 8 位,a 对应最低位,dp 对应最高位。所以如果想让数码管显示数字 0,那么共阴数码管的字符编码为 00111111,即 0x3f;共阳数码管的字符编码为 11000000,即 0xc0。可以看出两个编码的各位正好相反。 68 | 69 | 一位数码管要显示字符 0\~F,则对应的编码如下所示: 70 | 71 |  72 | 73 | 数码管本质上也是由 LED 构成的,因此在实际使用中,需要串接限流电阻,以共阳极数码管为例来说: 74 | 75 |  76 | 77 | ### 动态数码管 78 | 79 | 一个数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即 a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。 80 | 81 |  82 | 83 | 目前常用的是 4 位一体的数码管。其接口电路是把所有数码管的 8 个笔划段 a-h(h 即 dp 端)同名端连接起来,而每一个数码管由一个独立的公共极 COM 端控制。对于这种结构的数码管,采用动态显示的方法是最为广泛的一种显示方式之一。 84 | 85 | 下图所示的电路是由两个 4 位的共阳极数码管组成的一个 8 位的动态扫描显示电路。为增加驱动能力,在每个位选线处增加了一个 PNP 三极管。 86 | 87 |  88 | 89 | v 90 | 对于此 8 位的共阳极数码管,如要其显示 `8.8.8.8.8.8.8.8.`,需要做如下工作:1,将 A~H 的段选线全部设为低电平。2,将 8 个位选线全部设为高电平。但是,由于位选线是由 PNP 三极管构成的反相器所驱动,因此只有将相应三极管的基极(B 极)(即端口 1)设为低电平,三极管导通,位选线才会变为高电平。综上所述,上图中的电路,P5 端口及 P12 端口全部变为低电平的时候,数码管才能显示 `8.8.8.8.8.8.8.8.`。 91 | 92 | 那如何操作才能使得该数码管上显示不同的数据呢?答案是时分复用。即采用动态扫描的方式。例如,要在该数码管上显示 `12345678`,应该如下实现 93 | 94 | 1. 时刻 1,将最左侧的数码管的位选线置为有效,其余 7 个全部置为无效,同时将段选线设为显示 1 的数值(此处为 0x06) 95 | 96 | 2. 时刻 2,将最左侧第二个数码管的位选线置为有效,其余 7 个全部置为无效,同时将段选线设为显示 2 的数值(此处为 0x5B) 97 | 98 | 3. 时刻 3~8 依次类推,直至到最右侧数码管显示为 8 99 | 100 | 4. 循环重复上述 1~3 过程。 101 | 102 | 通过上述操作,则 8 个数码管能够分别显示不同的数值,但每一时刻只有一个数码管处于发光状态。如上述过程足够快(每秒钟循环 30 次以上),由于人眼的视觉残留效应,会感觉到 8 个数码管在同时发光,并且显示出不同的数值。 103 | 104 | 注意,循环频率也不宜过快,以 30~100Hz 为宜。 105 | 106 | ### LED 点阵 107 | 108 | LED 点阵分为共阴极和共阳极两类,如下图所示,左边为共阴极右边为共阳极。 109 | 110 |  111 | 112 | 以 8×8 共阴极 LED 点阵为例,共包含 64 个 LED 灯,构成 8 行 8 列的点阵,每一行的 8 个 LED 灯的阴极接在一起,由行使能信号控制,阳极分别接到 8 个列控制信号上。同理,每一列的 8 个 LED 灯的阳极接在一起,由列使能信号控制,阴极分别接到 8 个行使能信号上。通过 8 个行使能信号及 8 个列使能信号,可以独立的控制 64 个 LED 中每一个灯的亮灭。但是通常情况下,都是采用行扫描的方式进行显示。 113 | 114 | LED 阵列的显示方式是按显示编码的顺序,一行一行地显示。每一行的显示时间大约为 4ms,由于人类的视觉暂留现象,将感觉到 8 行 LED 是在同时显示的。若显示的时间太短,则亮度不够,若显示的时间太长,将会感觉到闪烁。本文采用低电平逐行扫描,高电平输出显示信号。即轮流给行信号输出低电平,在任意时刻只有一行发光二极管是处于可以被点亮的状态,其它行都处于熄灭状态。 115 | 116 | 如下图所示,使用 4 个 8×8 的 LED 点阵,可以扩展成一个 16×16 的 LED 点阵,为增加驱动能力,可以通过一 PNP 反向放大器来控制行选择信号。 117 | 118 |  119 | 120 | ### 1602 液晶屏 121 | 122 | 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式 LCD,目前常用 16\*1,16\*2,20\*2 和 40\*2 行等的模块。16\*2 的显示模块通常称为 1602. 123 | 124 | 1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。 125 | 126 |  127 | 128 |  129 | 130 | 1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口说明如下所示 131 | 132 |  133 | 134 | 第 1 脚:VSS 为地电源。 135 | 136 | 第 2 脚:VDD 接 5V 正电源。 137 | 138 | 第 3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 139 | 140 | 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 141 | 142 | 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。 143 | 144 | 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 145 | 146 | 第 7~14 脚:D0~D7 为 8 位双向数据线。 147 | 148 | 第 15 脚:背光源正极(无背光器件无此管脚)。 149 | 150 | 第 16 脚:背光源负极(无背光器件无此管脚)。 151 | 152 | 1602 液晶模块内部的控制器共有 11 条控制指令,如下所示 153 | 154 |  155 | 156 | 1602 液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、0 为低电平) 157 | 158 | 指令 1:清显示,指令码 01H,光标复位到地址 00H 位置。 159 | 160 | 指令 2:光标复位,光标返回到地址 00H。 161 | 162 | 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 163 | 164 | 指令 4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 165 | 166 | 指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 167 | 168 | 指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10 的点阵字符。 169 | 170 | 指令 7:字符发生器 RAM 地址设置。 171 | 172 | 指令 8:DDRAM 地址设置。 173 | 174 | 指令 9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 175 | 176 | 指令 10:写数据。 177 | 178 | 指令 11:读数据。 179 | 180 | 读写操作时序如图所示: 181 | 182 |  183 | 184 |  185 | 186 | 读操作时序 187 | 188 |  189 | 190 | 写操作时序 191 | 192 | 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图 10-57 是 1602 的内部显示地址。 193 | 194 |  195 | 196 | 1602LCD 内部显示地址 197 | 198 | 例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H)+10000000B(80H)=11000000B(C0H)。 199 | 200 | 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 201 | 202 | 1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字符图形,如图 10-58 所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母 A 的代码是 01000001B(41H),显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母 A 203 | 204 |  205 | 206 | 字符代码与图形对应图 207 | 208 | 1602LCD 的一般初始化(复位)过程 209 | 210 | 延时 15mS 211 | 212 | 写指令 38H(不检测忙信号) 213 | 214 | 延时 5mS 215 | 216 | 写指令 38H(不检测忙信号) 217 | 218 | 延时 5mS 219 | 220 | 写指令 38H(不检测忙信号) 221 | 222 | 以后每次写指令、读/写数据操作均需要检测忙信号 223 | 224 | 写指令 38H:显示模式设置 225 | 226 | 写指令 08H:显示关闭 227 | 228 | 写指令 01H:显示清屏 229 | 230 | 写指令 06H:显示光标移动设置 231 | 232 | 写指令 0CH:显示开及光标设置 233 | 234 | ### VGA 接口 235 | 236 | VGA(Video Graphics Array)视频图形阵列是 IBM 于 1987 年提出的一个使用模拟信号的电脑显示标准。VGA 接口即电脑采用 VGA 标准输出数据的专用接口。VGA 接口共有 15 针,分成 3 排,每排 5 个孔,显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号 (水平和垂直信号)。 237 | 238 |  239 | 240 | VGA 接口是一种 D 型接口,上面共有 15 针孔,分成三排,每排五个。其中,除了 2 根 NC(Not Connect) 信号、3 根显示数据总线和 5 个 GND 信号,比较重要的是 3 根 RGB 彩色分量信号和 2 根扫描同步信号 HSYNC 和 VSYNC 针。VGA 接口中彩色分量采用 RS343 电平标准。RS343 电平标准的峰值电压为 1V。VGA 接口是显卡上应用最为广泛的接口类型,多数的显卡都带有此种接口。有些不带 VGA 接口而带有 DVI(Digital Visual Interface 数字视频接口)接口的显卡,也可以通过一个简单的转接头将 DVI 接口转成 VGA 接口,通常没有 VGA 接口的显卡会附赠这样的转接头。 241 | 242 | 大多数计算机与外部显示设备之间都是通过模拟 VGA 接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为 R、G、B 三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。对于模拟显示设备,如模拟 CRT 显示器,信号被直接送到相应的处理电路,驱动控制显像管生成图像。而对于 LCD、DLP 等数字显示设备,显示设备中需配置相应的 A/D(模拟/数字)转换器,将模拟信号转变为数字信号。在经过 D/A 和 A/D 两次转换后,不可避免地造成了一些图像细节的损失。VGA 接口应用于 CRT 显示器无可厚非,但用于连接液晶之类的显示设备,则转换过程的图像损失会使显示效果略微下降。 243 | 244 | 而且可以从接口处来判断显卡是独显还是集成显卡,VGA 接口竖置的说明是集成显卡,VGA 接口横置说明是独立显卡(一般的台式主机都可以用此方法来查看) 245 | 246 |  247 | 248 |  249 | 250 | 显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,完成一屏后在返回来扫描剩下的线,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。 251 | 252 | 完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频率,即刷新一屏的频率,常见的有 60Hz,75Hz 等等。标准的 VGA 显示的场频 60Hz,行频 31.5KHz。 253 | 254 | 行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。 255 | 256 | 显示带宽:带宽指的显示器可以处理的频率范围。如果是 60Hz 刷新频率的 VGA,其带宽达 640x480x60=18.4MHz,70Hz 的刷新频率 1024x768 分辨率的 SVGA,其带宽达 1024x768x70=55.1MHz。 257 | 258 | 时钟频率:以 640x480@59.94Hz (60Hz) 为例,每场对应 525 个行周期 (525=10+2+480+33),其中 480 为显示行。每场有场同步信号,该脉冲宽度为 2 个行周期的负脉冲,每显示行包括 800 点时钟,其中 640 点为有效显示区,每一行有一个行同步信号,该脉冲宽度为 96 个点时钟。由此可知:行频为 525\*59.94=31469Hz,需要点时钟频率:525\*800\*59.94 约 25MHz. 259 | 260 |  261 | 262 | VESA 中定义行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分。VGA 工业标准显示模式要求:行同步,场同步都为负极性,即同步脉冲要求是负脉冲。 263 | 264 | 由 VGA 的行时序可知:没一行都有一个负极性行同步脉冲(Sync a),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿(Back porch b),在显示时序段(Display interval c)显示器为亮的过程,RGB 数据驱动一行上的每一个像素点,从而显示一行。在一行的最后为显示前沿(Front porch d)。在显示时间段(Display interval c)之外没有图像投射到屏幕是插入消隐信号。同步脉冲 (Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)都是在行消隐间隔内 (Horizontal Blanking Interval),当消隐有效时,RGB 信号无效,屏幕不显示数据。 265 | 266 | VGA 的场时序与行时序基本一样,每一帧的负极性脉冲(Sync a)是一帧的结束标志,同时也是下一帧的开始标志。而显示数据是一帧的所有行数据。 267 | 268 | 下面以 800x600@60Hz 分辨率威力详细讲解 VGA 时序: 269 | 270 |  271 | 272 | 为简化设计,本实验平台采用的是 8 位,256 色的 VGA 视频接口,如下图所示,通过不同阻值的限流电阻,将数字信号转换成模拟信号。 273 | 274 |  275 | 276 | ### RS232 接口 277 | 278 | 串口是计算机上一种非常通用的设备通信协议 279 | 280 |   281 | 282 | 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可 283 | 284 | RS-232 串口通信最远距离是 50 英尺 285 | 286 | RS232 可做到双向传输,全双工通讯,最高传输速率 20kbps 287 | 288 | RS-232C 289 | 290 | 上传送的数字量采用负逻辑,且与地对称。逻辑 1:-3 ~-15V,逻辑 0:+3~+15V,所以与单片机连接时常常需要加入电平转换芯片,如下图所示 291 | 292 |  293 | 294 | 串口通信参数: 295 | 296 | a)波特率:RS-232-C 标准规定的数据传输速率为每秒 50、75、100、150、300、600、1200、2400、4800、9600、19200 波特。 297 | 298 | b)数据位:标准的值是 5、7 和 8 位,如何设置取决于你想传送的信息。比如,标准的 ASCII 码是 0~127(7 位);扩展的 ASCII 码是 0~255(8 位)。 299 | 300 | c)停止位:用于表示单个包的最后一位,典型的值为 1,1.5 和 2 位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。 301 | 302 | d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是 011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位 1,这样就有 3 个逻辑高位。 303 | 304 | 串口通信的传输格式: 305 | 306 | 串行通信中,线路空闲时,线路的 TTL 电平总是高,经反向 RS232 的电平总是低。一个数据的开始 RS232 线路为高电平,结束时 Rs232 为低电平。数据总是从低位向高位一位一位的传输。示波器读数时,左边是数据的高位。例如,对于 16 进制数据 55aaH,当采用 8 位数据位、1 位停止位传输时,它在信号线上的波形如图所示。 307 | 308 | 55H=01010101B,取反后 10101010B,加入一个起始位 1,一个停止位 0,55H 的数据格式为 1010101010B;aaH=10101010B,取反后 01010101B,加入一个起始位 1,一个停止位 0,55H 的数据格式为 1101010100B 309 | 310 |  311 | 312 |  313 | 314 | 串口通信的接收过程:(异步通信:接收器和发送器有各自的时钟;同步通信:发送器和接收器由同一个时钟源控制。RS232 是异步通信) 315 | 316 | 1. 开始通信时,信号线为空闲(逻辑 1),当检测到由 1 到 0 的跳变时,开始对“接收时钟”计数。 317 | 318 | 2. 当计到 8 个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。 319 | 320 | 3. 接收端检测到起始位后,隔 16 个接收时钟,对输入信号检测一次,把对应的值作为 D0 位数据。若为逻辑 1, 作为数据位 1;若为逻辑 0,作为数据位 0。 321 | 322 | 4. 再隔 16 个接收时钟,对输入信号检测一次,把对应的值作为 D1 位数据。„.,直到全部数据位都输入。 323 | 324 | 5. 检测校验位 P(如果有的话)。 325 | 326 | 6. 接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位 S(逻辑 1),若此时未收到逻辑 1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志。 327 | 328 | 7. 本幀信息全部接收完,把线路上出现的高电平作为空闲位。 329 | 330 | 8. 当信号再次变为低时,开始进入下一幀的检测。 331 | 332 |  333 | 334 | 单片机常用 11.0592M 的的晶振,这个奇怪数字是有来历的:波特率为 9600BPS 每位位宽 t1=1/9600s 晶振周期 t2=1/11.0592/1000000S 单片机机器周期 t3=12\*t2 t1/t3=96,即对于 9600BPS 的串口,单片机对其以 96 倍的速率进行采样。如果单片机晶振用的不正确,会对串口接受产生误码。 335 | 336 | ### PS2 接口 337 | 338 | PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用。物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的mini-DIN。图1就是两种连接器的引脚定义。使用中,主机提供+5V电源给鼠标,鼠标的地连接到主机电源地上。 339 | 340 |  341 | 342 | PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时钟信号。 343 | 344 | 如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。 345 | 346 |  347 | 348 | PS/2鼠标的四种工作模式是:Reset模式,当鼠标上电或主机发复位命令 0xFF 给它时进入这种模式;Stream 模式鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工作;Remote 模式,只有在主机发送了模式设置命令 0xF0 后,鼠标才进入这种模式;Wrap 模式,这种模式只用于测试鼠标与主机连接是否正确。 349 | 350 | PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机。每次发送4个字节:BYTE1 BYTE2 BYTE3 BYTE4 351 | 352 | 定义分别是: 353 | 354 | BYTE1 -- 355 | 356 | |--bit7: 1 表示 Y 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出 357 | 358 | |--bit6: 1 表示 X 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出 359 | 360 | |--bit5: Y 坐标变化的符号位,1表示负数,即鼠标向下移动 361 | 362 | |--bit4: X 坐标变化的符号位,1表示负数,即鼠标向左移动 363 | 364 | |--bit3: 恒为1 365 | 366 | |--bit2: 1表示中键按下 367 | 368 | |--bit1: 1表示右键按下 369 | 370 | |--bit0: 1表示左键按下 371 | 372 | BYTE2 -- X 坐标变化量,与 byte 的 bit4 组成 9 位符号数,负数表示向左移,正数表右移。用补码表示变化量 373 | 374 | BYTE3 -- Y 坐标变化量,与 byte 的 bit5 组成 9 位符号数,负数表示向下移,正数表上移。用补码表示变化量 375 | 376 | BYTE4 -- 滚轮变化。 377 | 378 |  379 | 380 |  381 | 382 | 如果数据位中 1 的个数为偶数,校验位就为 1;如果数据位中 1 的个数为奇数,校验位就为 0;总之,数据位中 1 的个数加上校验位中 1 的个数总为奇数,因此总进行奇校验。 383 | 384 | ps2 设备的 clock 和 data 都是集电极开路的,平时都是高电平。当 ps2 设备等待发送数据时,它首先检查 clock 是否为高。如果为低,则认为 PC 抑制了通讯,此时它缓冲数据直到获得总线的控制权。如果 clock 为高电平,ps2 则开始向 PC 发送数据。 385 | 386 | 一般都是由 ps2 设备产生时钟信号。发送按帧格式。数据位在 clock 为高电平时准备好,在 clock 下降沿被 PC 读入。 387 | 388 | 数据从键盘/鼠标发送到主机或从主机发送到键盘/鼠标,时钟都是 PS2 设备产生。主机对时钟控制有优先权,即主机想发送控制指令给 PS2 设备时,可以拉低时钟线至少 100μS,然后再下拉数据线,最后释放时钟线为高。PS2 设备的时钟线和数据线都是集电极开路的,容易实现拉低电平。 389 | 390 | PC 在时钟的下降沿读取数据。 391 | 392 | PS: ps2 协议是现在大多数鼠标,键盘与 PC 通讯的标准协议,鼠标的通讯更为简单些,只是传送的数据内容不一样而已。 393 | 394 |  395 | 396 | 从 PS/2 向 PC 机发送一个字节可按照下面的步骤进行: 397 | 398 | (1) 检测时钟线电平,如果时钟线为低,则延时 50μs; 399 | 400 | (2) 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到 (1); 401 | 402 | (3) 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时 PC 机在向 PS/2 设备发送数据,所以 PS/2 设备要转移到接收程序处接收数据); 403 | 404 | (4) 延时 20μs(如果此时正在发送起始位,则应延时 40μs); 405 | 406 | 5. 输出起始位 0. 到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保 PC 机没有抑制 PS/2 设备,如果有则中止发送; 407 | 408 | 6. 输出 8 个数据位到数据线上; 409 | 410 | 7. 输出校验位; 411 | 412 | 8. 输出停止位 1. ; 413 | 414 | 9. 延时 30μs(如果在发送停止位时释放时钟信号则应延时 50μs); 415 | 416 | 通过以下步骤可发送单个位: 417 | 418 | 1. 准备数据位(将需要发送的数据位放到数据线上); 419 | 420 | 2. 延时 20μs; 421 | 422 | 3. 把时钟线拉低; 423 | 424 | 4. 延时 40μs; 425 | 426 | 5. 释放时钟线; 427 | 428 | 6. 延时 20μs。 429 | 430 | PS/2设备从PC机接收一个字节 431 | 432 | 由于 PS/2 设备能提供串行同步时钟,因此,如果 PC 机发送数据,则 PC 机要先把时钟线和数据线置为请求发送的状态。PC 机通过下拉时钟线大于 100μs 来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当 PS/2 设备检测到需要接收的数据时,它会产生时钟信号并记录下面 8 个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。而 PS/2 设备则要配合 PC 机才能读到准确的数据。具体连接步骤如下: 433 | 434 | 1. 等待时钟线为高电平。 435 | 436 | 2. 判断数据线是否为低,为高则错误退出,否则继续执行。 437 | 438 | 3. 读地址线上的数据内容,共 8 个 bit,每读完一个位,都应检测时钟线是否被 PC 机拉低,如果被拉低则要中止接收。 439 | 440 | 4. 读地址线上的校验位内容,1 个 bit。 441 | 442 | 5. 读停止位。 443 | 444 | 6. 如果数据线上为 0(即还是低电平),PS/2 设备继续产生时钟,直到接收到 1 且产生出错信号为止(因为停止位是 1,如果 PS/2 设备没有读到停止位,则表明此次传输出错)。 445 | 446 | 7. 输出应答位。 447 | 448 | 8. 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。 449 | 450 | 9. 延时 45 μs,以便 PC 机进行下一次传输。 451 | 452 | 读数据线的步骤如下: 453 | 454 | 1. 延时 20μs; 455 | 456 | 2. 把时钟线拉低 457 | 458 | 3. 延时 40μs 459 | 460 | 4. 释放时钟线 461 | 462 | 5. 延时 20μs 463 | 464 | 6. 读数据线。 465 | 466 | 下面的步骤可用于发出应答位; 467 | 468 | 1. 延时 15μs; 469 | 470 | 2. 把数据线拉低; 471 | 472 | 3. 延时 5μs; 473 | 474 | 4. 把时钟线拉低; 475 | 476 | 5. 延时 40μs; 477 | 478 | 6. 释放时钟线; 479 | 480 | 7. 延时 5μs; 481 | 482 | 8. 释放数据线。 483 | 484 | 键盘的处理器如果发现有键被按下或释放将发送扫描码的信息包到计算机。扫描码有两种不同的类型:通码和断码。当一个键被按下就发送通码,当一个键被释放就发送断码。每个按键被分配了唯一的通码和断码。这样主机通过查找唯一的扫描码就可以测定是哪个按键。每个键一整套的通断码组成了扫描码集。有三套标准的扫描码集:分别是第一套,第二套和第三套。所有现代的键盘默认使用第二套扫描码。 485 | 486 | 虽然多数第二套通码都只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽。这类的通码第一个字节总是为 E0。 487 | 488 | 正如键按下通码就被发往计算机一样,只要键一释放断码就会被发送。每个键都有它自己唯一的通码和断码。幸运的是你不用总是通过查表来找出按键的断码。在通码和断码之间存在着必然的联系。多数第二套断码有两字节长。它们的第一个字节是 F0,第二个字节是这个键的通码。扩展按键的断码通常有三个字节,它们前两个字节是 E0h,F0h,最后一个字节是这个按键通码的最后一个字节。下面列出了几个按键的第二套通码和断码: 489 | 490 |  491 | 492 | 一个键盘发送值的例子: 493 | 494 | 通码和断码是以什么样的序列发送到你的计算机从而使得字符 G 出现在你的字处理软件里的呢?因为这是一个大写字母,需要发生这样的事件次序:按下 Shift 键 - 按下 G 键 - 释放 G 键 - 释放 Shift 键。与这些时间相关的扫描码如下:Shift 键的通码 12h,G 键的通码 34h,G 键的断码 F0h 34h,Shift 键的断码 F0h 12h。因此发送到你的计算机的数据应该是: 495 | 496 | ```text 497 | 12h 34h F0h 34h F0h 12h 498 | ``` 499 | -------------------------------------------------------------------------------- /docs/doc_simple_logic.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 简单组合逻辑电路 3 | sidebar: mydoc_sidebar 4 | permalink: doc_simple_logic.html 5 | folder: mydoc 6 | --- 7 | 8 | # 简单组合逻辑电路 9 | 10 | ## verilog 中的数字表示 11 | 12 | 在 Verilog HDL 中一个信号可能有如下四种基本的值: 13 | 14 | 1. `0`:逻辑 0 或假 15 | 2. `1`:逻辑 1 或真 16 | 3. `x`:未知 17 | 4. `z`:高阻态(三态) 18 | 19 | 在门电路的输入端或是表达式中的 z 值通常会被译为一个 x 值(待确定)。通常情况下,Verilog HDL 是区分大小写的,但是作为值来表示时是不区分大小写的。 20 | 21 | 在 Verilog HDL 中有三种常量类型:(i) 整型,(ii) 实型,和 (iii) 字符串。在整型常量和实型常量中可以使用下划线(`_`)来增加可读性。但它不能出现在第一个和最后一个字符的位置上。 22 | 23 | 整数可以写成 (i) 简单的十进制数或者是 (ii) 带进制格式。一个写成简单十进制形式的整数由一个可省略的 + 或是一个 - 和一串数字组成。比如, 24 | 25 | ```verilog 26 | 15 27 | -32 28 | ``` 29 | 30 | 其中 15 可以被写成 5 比特格式的二进制数 `01111`,-32 可以写成 6 比特格式的 `100000`。简单的十进制数在硬件中最终会占用 32 比特。 31 | 32 | 一个数也可以被表示为进制格式,语法格式如下: `[size]’base value`。 33 | 其中 size 代表数的比特数,base(基)是 o 或者 O(代表八进制 octal),b 或者 B(代表二进制 Binary),d 或者 D(代表十进制 Decimal),h 或者 H(代表十六进制 hexadecimal)中的一个。Value 是一个在该进制下有效的数字的序列。Value 必须是无符号的。比如,wire [4:0] 5'O37 //5 比特八进制表示 34 | 35 | ```verilog 36 | reg [3:0] 4'B1x_01 // 4 比特二进制 37 | wire [3:0] 4'd-4 // 不合法,value 不能是负数 38 | wire [11:0] 7'Hx // 7 比特 x 扩展到 xxxxxxx 39 | ``` 40 | 41 | 如果 size 设定得比设定的常数的值的大小要大,这个数会被用 0 扩展到左边,除非最左边的比特是 x 或 z,此时也会相应地用 x 或 z 扩展。如果 size 设定得更小,那左边的多余的位会被忽略。如果 size 未设定,那么就会使用 32 比特。 42 | 43 | ## 实验目标 44 | 45 | 完成本次实验后,你将能做到: 46 | 47 | - 定义不同进制的数 48 | - 设计能将数据从一个进制转化到另一个的组合电路 49 | - 设计能实现简单的加法操作的组合电路 50 | - 学到一个能提高加法操作速度的技巧 51 | 52 | ## 设计一个 BCD 码到 7 段数码管的译码器 53 | 54 | ### 数码管原理 55 | 56 | 7 段数码管显示器包含 7 段,编号从 a 到 g,可以用来显示一个字符。根据不同的输入类型,可能需要做类型转换。如果需要显示 4bit 的 BCD 码,则需要一个 BCD 码到 7 段数码管的译码器。下表展示了你要显示一个数字的 bit 图样。 57 | (需要注意的是,你如果需要点亮某一段,则要输出逻辑 0 到这一段,并且这个显示器的阳极需要用板上的逻辑 0 驱动)。 58 | 59 |  60 | 61 | | 输入 | a | b | c | d | e | f | g | 62 | | :----: |:----: | :----: | :----: |: ----: | :----: | :----: | :----: | 63 | | 0000 | 0 |0 | 0 | 0 | 0 | 0 |1 | 64 | |0001|1|0|0|1|1|1|1| 65 | |0010|0|0|1|0|0|1|0| 66 | |0011|0|0|0|0|1|1|0| 67 | |0100|1|0|0|1|1|0|0| 68 | |0101|0|1|0|0|1|0|0| 69 | |0110|0|1|0|0|0|0|0| 70 | |0111|0|0|0|1|1|1|1| 71 | |1000|0|0|0|0|0|0|0| 72 | |1001|0|0|0|0|1|0|0| 73 | |1010 到 1111|X|X|X|X|X|X|X| 74 | 75 | Nexys4 DDR 开发板包含两个 4 位 7 段数码管 LED 显示器。每个模块中 4 位的每 1 位都由 7 段组成,每一段都嵌入了一颗 LED,顺序如下图。每段的 LED 可以被单独点亮。因而通过点亮特定的段,熄灭其他段,全部 128 种图样都可以在 1 位上实现。在这 128 种图样中,10 种数字的图样最有用。 76 | 77 |  78 | 79 |  80 | 81 | 组成每一位的 7 颗 LED 的阳极被连接在一起,称为“共阳极”的电路节点,但 LED 的阴极是独立的。共阳极节点的信号可以被获取作为 4 位显示器的使能信号。不同位,相同段的阴极信号分别接到 7 个电路节点,从 CA 到 CG (比如上图中 4 位的“D”笔画的阴极被连接到一起,连接到“CD”这个电路节点)。这 7 个阴极节点信号可以被获取作为 4 位显示器的输入信号。这种信号连接的方案支持了多路复用的显示,虽然每个笔 画的阴极信号是 4 位共用的,但它们只能点亮阳极信号生效的位上的笔画。 82 | 83 |  84 | 85 | 扫描显示控制器电路可以用来控制这个显示器显示一个 4 位数。这个电路根据阴极图样,以高于人眼可分辨地频率,对每一位的阳极信号进行重复地、持续地、接连地驱动。如果它的更新或“刷新”率降到大约 45 Hz 时,大多数人能看出显示在闪烁。从 Lab 8(体系结构向导和知识产权目录)开始你将设计和使用一个扫描电路。 86 | 87 | ### 实验步骤 88 | 89 | 1. 打开 Vivado,创建一个名为 lab2.1 的空白工程(project)。 90 | 91 | 2. 创建一个顶层 Verilog module,命名为 bcdto7segment_dataflow,按数据流建模风格添加 4-bit data。输入 `x[3:0]`,阳极使能输出信号 `an[3:0]`,7-bit 输出 `seg[6:0]`。(提示:你必须在纸上推导 7 个段的七个表达式。). 对 `an[3:0]` 输出合适的信号使得只有最右边的一位显示。 92 | 93 | 3. 添加对应开发板的 XDC 文件到工程。编辑 XDC 文件,将 SW3-SW0 赋给 `x[3:0]`,`CA`, `CB`, `CC`, `CD`, `CE`, `CF`, `CG` 给 `seg[0]` 到 `seg[6]`,J17, J18, T9,J14, P14, T14, K2, U13 给 `an[7]`, `an[6]`, `an[5]`, `an[4]`, `an[3]`, `an[2]`, `an[1]`, `an[0]` (Nexys4 DDR 开发板) 94 | 95 | 4. 综合你的设计。 96 | 97 | 5. 实现你的设计。 98 | 99 | 6. 生成比特流文件,将其下载到 Basys3 或 Nexys4 DDR 开发板,并验证功能。 100 | 101 | ### 参考代码 102 | 103 | ```verilog 104 | module lab2_1( 105 | input [3:0]x, 106 | output reg [7:0]seg, 107 | output [7:0]an 108 | ); 109 | assign an=8'b1111_1110; 110 | always@(*) 111 | case(x) 112 | 0: seg= 8'b 1100_0000; 113 | 1: seg= 8'b 1111_1001; 114 | 2:seg= 8'b 1010_0100; 115 | 3: seg= 8'b 1011_0000; 116 | 4: seg= 8'b 1001_1001; 117 | 5: seg= 8'b 1001_0010; 118 | 6: seg= 8'b 1000_0010; 119 | 7: seg= 8'b 1111_1000; 120 | 8: seg= 8'b 1000_0000; 121 | 9:seg= 8'b 1001_0000; 122 | default seg=8'bxxxx_xxxx; 123 | endcase 124 | endmodule 125 | ``` 126 | 127 | 修改对应的 xdc 文件段落,大致如下图: 128 | 129 | ```shell 130 | set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { seg[0] }]; #IO_L24N_T3_A00_D16_14 Sch=ca 131 | set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { seg[1] }]; #IO_25_14 Sch=cb 132 | set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { seg[2] }]; #IO_25_15 Sch=cc 133 | set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { seg[3] }]; #IO_L17P_T2_A26_15 Sch=cd 134 | set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { seg[4] }]; #IO_L13P_T2_MRCC_14 Sch=ce 135 | set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { seg[5] }]; #IO_L19P_T3_A10_D26_14 Sch=cf 136 | set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { seg[6] }]; #IO_L4P_T0_D04_14 Sch=cg 137 | 138 | set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { seg[7] }]; #IO_L19N_T3_A21_VREF_15 Sch=dp 139 | 140 | set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] 141 | set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] 142 | set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] 143 | set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] 144 | set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] 145 | set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] 146 | set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] 147 | set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] 148 | ``` 149 | 150 | ## 将 4 比特的输入转化为相应的 2 位十进制数(BCD 码)后输出到 LED 灯(最高位)和最右边的七段数码管(更低位)上 151 | 152 | ### 原理介绍 153 | 154 | 设计一个能将 4 比特的二进制数 v 转换到它相应的 2 位十进制数,z 和 m。由于正确的输入范围是 0 到 15,最高位可以只使用一个 LED 等来显示。下表显示了要求的输出值。下图中给出了设计框图。它包含一个检查 v 值是否大于 9 的比较器(comparator),并使用比较器的输出来控制七段数码管的显示。提示:只要 v 大于二进制的 1001,m3 就会是 0。 155 | 156 | | v[3:0] | z | m[3:0] | 157 | | ------ | ---- | ------ | 158 | |0000| 0| 0000| 159 | |0001| 0| 0001| 160 | |0010| 0| 0010| 161 | |0011| 0| 0011| 162 | |0100| 0| 0100| 163 | |0101| 0| 0101| 164 | |0110| 0| 0110| 165 | |0111| 0| 0111| 166 | |1000| 0| 1000| 167 | |1001| 0| 1001| 168 | |1010| 1| 0000| 169 | |1011| 1| 0001| 170 | |1100| 1| 0010| 171 | |1101| 1| 0011| 172 | |1110| 1| 0100| 173 | |1111| 1| 0101| 174 | 175 |  176 | 177 | ### 模块调用 178 | 179 | #### 模块 180 | 181 | Verilog HDL 程序是由模块构成的。每个模块的内容都是嵌在 `module` 和 `endmodule` 两个语句之间。每个模块实现特定的功能。模块可以进行层次嵌套。 182 | 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。 183 | Verilog HDL 程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 184 | 除了 endmodule 语句外,每个语句和数据定义的最后必须有分号。 185 | 可以用 `/* */` 和 `//` 对 Verilog HDL 程序的任何部分作注释。一个好的,有使 186 | 用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。 187 | 188 | #### Verilog 模块调用端口的连接规则 189 | 190 | 在 verilog 中,所有的端口隐含地声明 wire 类型;如果输出类型的端口需要保存数值,则必须将其显式地声明为 reg 数据类型。 191 | 不能将 input 和 inout 类型的端口声明为 reg 数据类型,因为 reg 类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化。 192 | 在 verilog 中,有两种端口声明风格: 193 | 194 |  195 | 196 | ##### 具体端口连接规则 197 | 198 |  199 | 200 |  201 | 202 | 端口连接规则 将一个端口看成由相互链接的两个部分组成,一部分位于模块内部,另一部分位于模块外部。当在一个模块中调用(实例引用)另一个模块时,端口之间的连接必须遵守一些规则。 203 | 204 | 1. 输入端口:从模块内部来讲,输入端口必须为线网数据类型,从模块外部来看,输入端口可以连接到线网或者 reg 数据类型的变量。 205 | 2. 输出端口:从模块内部来讲,输出端口可以是线网或者 reg 数据类型,从模块外部来看,输出必须连接到线网类型的变量(显式,隐式),而不能连接到 reg 类型的变量。 206 | 3. 输入/输出端口(必须为 wire)从模块内部来讲,输入/输出端口必须为线网数据类型;从模块外部来看,输入/输出端口也必须连接到线网类型的变量。 207 | 208 | ### 实验步骤 209 | 210 | 1. 打开 Vivado,创建一个名为 lab2_2_1 的空白工程。 211 | 212 | 2. 创建并添加一个 Verilog 模块(命名为 lab2.2)以 v[3:0]为输入,z 和 m[3:0] 作为输出。创建并添加模块,使用数据流结构(dataflow constructs)来完成比较器数据流(comparator_dataflow),lab2 的电路 A 的数据流(lab2_circuitA_dataflow),实例化 2-to-1 多路选择器(Lab1 的),并将它们按上图连接起来。 213 | 214 | 3. 创建一个包含 bcdto7segment_dataflow decoder(你在 Lab1 中开发的)的顶层模块(lab2.1)并提供一个 7 比特的输出 seg0 而不是 m。 215 | 216 | 4. 将与开发板对应的 XDF 文件添加到工程中,编辑文件添加相关的端口。将输入 v 赋给 SW3 到 SW0,z 赋给 LED0,seg0 赋给七段数码管显示阴极 CA 到 CG,将 an 赋给端口 J17,J18,T9,J14,P14,T14,K2,U13(对于 Nexys4 DDR)或是 U2,U4,V4,W4(对于 Basys3)。 217 | 218 | 5. 综合(Synthesize)并实现(implement)设计。 219 | 220 | 6. 生成比特流(bitstream),将它下载到 Basys3 或是 Nexys4 DDR 开发板上,并验证它的功能。 221 | 222 | ### 参考代码及讲解 223 | 224 | 由对应关系: 225 | 226 | | v[3:0] | z | m[3:0] | 227 | | ------ | ---- | ------ | 228 | |0000| 0| 0000| 229 | |0001| 0| 0001| 230 | |0010| 0| 0010| 231 | |0011| 0| 0011| 232 | |0100| 0| 0100| 233 | |0101| 0| 0101| 234 | |0110| 0| 0110| 235 | |0111| 0| 0111| 236 | |1000| 0| 1000| 237 | |1001| 0| 1001| 238 | |1010| 1| 0000| 239 | |1011| 1| 0001| 240 | |1100| 1| 0010| 241 | |1101| 1| 0011| 242 | |1110| 1| 0100| 243 | |1111| 1| 0101| 244 | 245 | 我们可以首先写出输入 m 与输出 m 与 z 的关系,使用数据流的模式来实现 246 | 247 | ```verilog 248 | reg [3:0]m; 249 | always@(*) 250 | begin 251 | case(v) 252 | 4'b0000: begin z=0; m=4'b0000; end 253 | 4'b0001: begin z=0; m=4'b0001; end 254 | 4'b0010: begin z=0; m=4'b0010; end 255 | 4'b0011: begin z=0; m=4'b0011; end 256 | 4'b0100: begin z=0; m=4'b0100; end 257 | 4'b0101: begin z=0; m=4'b0101; end 258 | 4'b0110: begin z=1; m=4'b0000; end 259 | 4'b0111: begin z=1; m=4'b0001; end 260 | 4'b1000: begin z=1; m=4'b0010; end 261 | 4'b1001: begin z=1; m=4'b0011; end 262 | 4'b1010: begin z=1; m=4'b0100; end 263 | 4'b1011: begin z=1; m=4'b0101; end 264 | 4'b1100: begin z=1; m=4'b0110; end 265 | 4'b1101: begin z=1; m=4'b0111; end 266 | 4'b1110: begin z=1; m=4'b1000; end 267 | 4'b1111: begin z=1; m=4'b1001; end 268 | endcase 269 | end 270 | ``` 271 | 272 | 添加我们在 lab1 中的代码: 273 | 274 |  275 | 276 | 在这里选择添加,也可以使用快捷键 ALT+A 277 | 278 |  279 | 280 | 选择 add desgin source 并且选择你的 lab1 文件 source 中的代码 281 | 282 | 在 lab2.2 函数中写入这个函数,并且实例化它 283 | 284 | 综上所述,具体的代码如下: 285 | 286 | ```verilog 287 | module lab2_2( 288 | input [3:0]v, 289 | output reg z, 290 | output [7:0]seg, 291 | output [7:0]an 292 | ); 293 | reg [3:0]m; 294 | always@(*) 295 | begin 296 | case(v) 297 | 4'b0000: begin z=0; m=4'b0000; end 298 | 4'b0001: begin z=0; m=4'b0001; end 299 | 4'b0010: begin z=0; m=4'b0010; end 300 | 4'b0011: begin z=0; m=4'b0011; end 301 | 4'b0100: begin z=0; m=4'b0100; end 302 | 4'b0101: begin z=0; m=4'b0101; end 303 | 4'b0110: begin z=0; m=4'b0110; end 304 | 4'b0111: begin z=0; m=4'b0111; end 305 | 4'b1000: begin z=0; m=4'b1000; end 306 | 4'b1001: begin z=0; m=4'b1001; end 307 | 4'b1010: begin z=1; m=4'b0000; end 308 | 4'b1011: begin z=1; m=4'b0001; end 309 | 4'b1100: begin z=1; m=4'b0010; end 310 | 4'b1101: begin z=1; m=4'b0011; end 311 | 4'b1110: begin z=1; m=4'b0100; end 312 | 4'b1111: begin z=1; m=4'b0101; end 313 | endcase 314 | end 315 | lab2_1 A(m,seg,an); //A 是实例化的名称 316 | endmodule 317 | ``` 318 | 319 | 在你具体在函数中写入调用函数时,会自动生成两个函数之间的调用关系,这是你可以看到 lab2_2 函数成为了顶层模块。 320 | 321 | ## 仅使用数据流级建模创建一个 4 比特波纹进位加法器 322 | 323 | ### 执行加法 324 | 325 | 当两个 1 比特的数相加时,它们可能会产生一个 2 比特的输出。比如,1 + 1 = 10(都是二 326 | 进制)。当你将三个 1 比特的数相加是,结果也会是 2 比特,比如,1 + 1 = 11。这种简单的操作可以被视为将两个比特与一个更低位的操作的进位输入相加,结果产生一个和与一个进位输出——左边的比特是进位输出,右边的比特是和。下图显示了一个 4 比特的加法器。由于进位是像波纹一样从最低比特位 (cin) 向最高比特位传递的,这样的加法器也叫波纹进位加法器(待确定)。 327 | 328 |  329 | 330 | ### 实验步骤 331 | 332 | 1. 打开 Vivado 并创建一个名为 lab2.3 的空白工程。 333 | 334 | 2. 创建并使用数据流级建模添加一个有三个输入(a, b, cin)和两个输出(s 和 cout)的名为 fulladder_dataflow 的 Verilog module。所有的输入和输出都应该是 1 比特位宽的。 335 | 336 | 3. 在工程中创建并添加一个有三个输入(a, b, cin)和两个输出(s 和 cout)的 Verilog module(名为 rca_dataflow),实例化全加器(FA)四次,并将它们按所需连接起来。这里的 a,b,和 s 应该是一个 4 比特的向量,cin 和 cout 应该是 1 比特位宽。 337 | 338 | 4. 对设计进行仿真(行为仿真)80ns 并验证功能。 339 | 340 | 5. 将与开发板对应的 XDF 文件添加到工程中,编辑文件添加相关的端口。将 SW4 到 SW7 赋给 a,将 SW0 到 SW3 赋给 b,LED3 到 LED0 赋给 s,SW15 赋给 cin,LED15 赋给 cout。 341 | 342 | 6. 综合(Synthesize)并实现(implement)设计。 343 | 344 | ### 参考代码及讲解 345 | 346 | 首先,我们需要编写一个一位的加法,具体原理请看前面的讲解: 347 | 348 | ```verilog 349 | module one_bit_add( 350 | input a, 351 | input b, 352 | input cin, 353 | output s, 354 | output reg cout 355 | ); 356 | assign s=a^b^cin; 357 | always@(*) 358 | begin 359 | if(a&b|a&cin|b&cin) 360 | cout=1; 361 | else 362 | cout=0; 363 | end 364 | endmodule 365 | ``` 366 | 367 | 在 lab2.3 的工程中重复调用这个模块,来实现我们的四位加法器,具体代码如下: 368 | 369 | ```verilog 370 | module lab2_3( 371 | input [3:0]a, 372 | input [3:0]b, 373 | output [3:0]s, 374 | input cin, 375 | output cout 376 | ); 377 | wire temp0,temp1,temp2; 378 | one_bit_add A(a[0],b[0],cin,s[0],temp0); 379 | one_bit_add B(a[1],b[1],temp0,s[1],temp1); 380 | one_bit_add C(a[2],b[2],temp1,s[2],temp2); 381 | one_bit_add D(a[3],b[3],temp2,s[3],cout); 382 | endmodule 383 | ``` 384 | 385 | #### 仿真代码 386 | 387 | 因为对参数中的变量手动一次次修改对于比较大的数字较为麻烦,所以在这里使用了循环语句。 388 | 389 | ```verilog 390 | module lab2_3_tb( 391 | ); 392 | reg [3:0]a; 393 | reg [3:0]b; 394 | wire [3:0]s; 395 | reg cin; 396 | wire cout; 397 | integer k; 398 | lab2_3 dut(a,b,s,cin,cout); 399 | initial 400 | begin 401 | a=0; b=0; cin=0; 402 | for(k=0;k<20;k=k+1) 403 | begin 404 | #10 if(k<10) 405 | a=a+1; 406 | else 407 | b=b+1; 408 | if(k==10) 409 | cin=1; 410 | end 411 | end 412 | endmodule 413 | ``` 414 | 415 | 查看仿真代码,确定自己的代码是否正确: 416 | 417 |  418 | 419 | ## 扩展实验内容 420 | 421 | ### 扩展实验 1 422 | 423 | 修改 3 中的工程,将 4 比特的输入看作 BCD 码完成加法,生成 BCD 码的结果并在 LED0 和最右边的七段数码管上显示出来。使用开关来输入两个 4 比特 BCD 数并用 SW15 输入进位。根据需求复用 2 和 3 中开发的模型。使用数据流级建模。 424 | 425 | #### 具体要求 426 | 427 | 1. 打开 Vivado 并创建一个名为 `lab2.kuozhan1` 的空白工程。 428 | 2. 按需求修改 3 中的工程,使之能完成需求的功能并将结果输出到 LED0 和最右边的七段数码管上显示 429 | 430 | 3. 将与开发板对应的 XDF 文件添加到工程中,编辑文件添加相关的端口。使用开关 431 | SW72-SW0 来给两个 4 比特的 BCD 提供输入,SW15 给进位。 432 | 4. 综合(Synthesize)并实现(implement)设计。 433 | 5. 生成比特流(bitstream),将它下载到 Basys3 或是 Nexys4 DDR 开发板上,并验证它的功能。 434 | 435 | ### 扩展实验 2 436 | 437 | 通过修改 3 中的工程并使用数据流级建模创建一个超前进位加法器电路 438 | 439 | #### 实验简介 440 | 441 | 波纹进位加法器在处理两个很大的数(比如 8 比特,16 比特,32 比特)的加法时会花很长时间运算。为了降低运算时间,可以使用另一个结构,超前进位加法器。它的工作方式是,基于以下轻轻为每个比特位分别创建两个信号(P 和 G):进位信号是否会从较低比特位传播过来(即至少有一个输入是 1),进位信号是否由此比特位生成(即两个输入均为 1),或者进位信号是否会被此比特位消灭(两个输入均为 0)。P 和 G 生成后,每个比特位的进位信号也生成了。 442 | 443 |  444 | 445 | 此处𝑃𝑖 = 𝐴𝑖 + 𝐵𝑖,𝐺𝑖 = 𝐴𝑖𝐵𝑖。在超前进位单元内,𝐶𝑖+1 = 𝐺𝑖 + 𝑃𝑖𝐶𝑖。这个加速是通过使 446 | 𝐶𝑖和相应的第 i 为一起生成而达到的。 447 | 448 | #### 具体要求 449 | 450 | 1. 打开 Vivado 并打开你在 3 中创建的工程。 451 | 452 | 2. 按需修改 3 中的工程,来使用超前进位结构完成两个 4 比特的数的加法并将结果输出到 LED 灯上。有由 SW15 提供进位。提示:你只需要将全加器修改为输出𝑃𝑖和 453 | 𝐺𝑖,然后创建并添加另一个超前进位(CLA)模块来完成超前进位功能(即输入𝑐0 和 454 | 𝑝𝑖𝑔𝑖(i = 0 到 3)并输出𝑐4、𝑝𝑔和𝑔𝑔。 455 | 456 | 3. 修改 XDF 文件来通过 SW3-SW0 提供输入 b,通过 SW7-SW4 提供输入 a,SW15 457 | 输入 cin。通过 LED15 输出 cout,LED3-LED0 输出 sum。 458 | 4. 综合(Synthesize)并实现(implement)设计。 459 | 5. 生成比特流(bitstream),将它下载到 Basys3 或是 Nexys4 DDR 开发板上,并验证它的功能。 460 | 461 | ## 总结 462 | 463 | 在这个实验中,你会学到如何定义不同进制的数。你还会使用数据流设计不同的转换数字的电路。你还会学习到一个提高加法速度的技能。 464 | -------------------------------------------------------------------------------- /docs/doc_simple_timing.md: -------------------------------------------------------------------------------- 1 | # 简单时序逻辑电路 2 | 3 | ## 1. 时序逻辑电路概念 4 | 5 | 在前述的组合逻辑中,任意时刻的输出只与该时刻的输入信号所决定;而在接下来要讲的时序电路中,任意时刻的输出信号不仅与当时刻的输入有关,而且与电路原来的状态有关。这需要电路要能记住历史输入,所以要引入时序概念。用时钟信号保障时序电路按照时序来运行。 6 | 7 | ## 2. 锁存器和触发器 8 | 9 | 锁存器和触发器是时序电路中常用的存储器设备。接下来将学习模拟各种类型的锁存器和使用带有控制信号的触发器。 10 | 11 | ### 2-1. 锁存器 12 | 13 | 锁存器是一种具有两种稳定状态的器件:高输出和低输出。锁存器具有反馈路径,因此设备可以保留信息。锁存器是易失性存储器设备,并且只要设备通电就可以存储一位数据。顾名思义,锁存器用于“锁定”信息并保持信息。 14 | 15 | #### 2-1-1. SR 锁存器 16 | 17 | **SR 锁存器**(置位/复位)是一个异步器件:它不依赖于控制信号工作,仅依赖于 S 和 R 输入的状态。它的符号表示、使用异或门级电路实现和真值表如下所示: 18 | 19 |  20 | 21 |  22 | 23 | 虽然 Xilinx FPGA 可以使用一个 LUT(查找表)电路实现这种锁存器,但以下 Verilog 代码显示了如何使用门级电路和数据流建模对这种电路进行建模。 24 | 25 | 门级: 26 | 27 | ```verilog 28 | module SR_latch_gate (input R, input S, output Q, output Qbar); 29 | nor (Q, R, Qbar); 30 | nor (Qbar, S, Q); 31 | endmodule 32 | ``` 33 | 34 | 数据流: 35 | 36 | ```verilog 37 | module SR_latch_dataflow (input R, input S, output Q, output Qbar); 38 | assign #2 Q = ~ (R | Qbar); 39 | assign #2 Qbar = ~ (S | Q); 40 | endmodule 41 | ``` 42 | 43 | ##### 实验目的 44 | 45 | 使用上面显示的代码设计 SR 锁存器。合成设计并查看合成设计的原理图。设计一个 Testbench 进行测试并验证设计。 46 | 47 | 该实验中将 S 输入分配给 SW0,将 R 输入分配给 SW1。将 Q 分配给 LED0,将 Qbar 分配给 LED1。实现该设计并进行仿真验证以及下载。 48 | 49 | ##### 实验步骤 50 | 51 | 1. 打开 Vivado 并创建一个名为 `lab5_1_1` 的空白项目。 52 | 2. 使用 SR_latch_dataflow 代码创建和添加 Verilog 模块。 53 | 3. 设计一个 Testbench 进行测试(也可以使用参考代码中的 Testbench),执行 100ns 的行为仿真,并验证设计。 54 | 55 | 若使用供参考的 Testbench,波形应该如下: 56 | 57 |  58 | 59 | 4. 将适当的板相关主 XDC 文件添加到项目中并编辑它以包括相关引脚,将 S 输入分配给 SW0,将 R 输入分配给 SW1,将 Q 分配给 LED0,将 Qbar 分配给 LED1。 60 | 5. 在“Bitstream Settings”中设置 tcl.pre 选项以指向提供的 `lab5_prehook.tcl` 文件。此文件允许将组合循环上载到电路板。 61 | 6. 合成设计并在 Synthesized Design 过程组下查看原理图。验证它使用 2 个 LUT 和 4 个 IO(2 个 IBUF 和 2 个 OBUF)。 62 | 7. 实现设计并查看项目摘要。它应该显示 2 个 LUT 和 4 个 IO。 63 | 8. 生成比特流,将其下载到 Nexys4 DDR 板,并验证功能。 64 | 65 | ##### 参考代码 66 | 67 | ```verilog 68 | module RS_latch_tb(); 69 | reg R,S; 70 | wire Q,Qbar; 71 | RS_latch TB (.R(R),.S(S),.Q(Q),.Qbar(Qbar)); 72 | initial begin 73 | R = 0; 74 | S = 0; 75 | #10 S = 1; 76 | #10 S = 0; 77 | #10 R = 1; 78 | #10 R = 0; S = 1; 79 | #10 R = 1; S = 0; 80 | #10 R = 0; S = 1; 81 | #10 R = 1; S = 0; 82 | #10 S = 1; 83 | end 84 | endmodule 85 | ``` 86 | 87 | #### 2-1-2. 门控 SR 锁存器 88 | 89 | 在某些情况下,可能需要指示锁存器何时需要锁存数据和何时不能锁存数据。这就引入了门控 SR 锁存器,门控 SR 锁存器是 SR 锁存器的简单扩展,它提供一条使能线,必须将其置为高电平才能够改变锁存器中锁存的数据。但即使现在有了控制线,SR 锁存器也不是同步的,因为即使在使能处于高电平时,输入可以随时改变输出。当使能输入为低电平时,AND 门的输出也为低电平,因此 Q 和条 Q 输出保持锁存到先前的数据。只有当 Enable 输入为高电平时,锁存器的状态才会发生变化,如真值表所示。当使能线被置高电平时,门控 SR 锁存器在操作上与 SR 锁存器相同。Enable 线有时是时钟信号,但通常是读或写控制线。门控 SR 锁存器的符号、电路和真值表如下所示。 90 | 91 |  92 | 93 |  94 | 95 | ##### 实验目的 96 | 97 | 使用数据流建模设计门控 SR 锁存器(如上图所示)。合成设计并查看合成设计的原理图。设计一个 Testbench 进行测试并验证设计。仿真设计。将 S 输入分配给 SW0,将 R 输入分配给 SW1,并将输入分配给 SW2。将 Q 分配给 LED0,将 Qbar 分配给 LED1。实现设计并进行仿真和下载。 98 | 99 | ##### 实验步骤 100 | 101 | 1. 打开 Vivado 并创建一个名为 lab5_1_2 的空白项目。 102 | 2. 创建并添加 Verilog 模块,该模块将使用数据流建模对门控 SR 锁存器进行建模。为模型中使用的每个赋值语句分配 2 个单位延迟。 103 | 3. 仿真 100ns。 104 | 105 | 若使用参考的 Testbench,得到的波形应该如下: 106 | 107 |  108 | 109 | 4. 将适当的电路板相关主 XDC 文件添加到项目中并对其进行编辑以包括相关引脚,将 S 输入分配给 SW0,将 R 输入分配给 SW1,将启用分配给 SW2,将 Q 分配给 LED0,将 Qbar 分配给 LED1。 110 | 5. 在“Bitstream Settings”中设置 tcl.pre 选项以指向提供的 lab5_prehook.tcl 文件。此文件允许将组合循环上载到电路板。 111 | 6. 合成设计并在 Synthesized Design 过程下查看原理图。验证它使用 2 个 LUT 和 5 个 IO 112 | 7. 实现设计并查看项目摘要。它应该显示 2 个 LUT 和 5 个 IO。 113 | 8. 设计 Testbench 以仿真和验证设计。它应产生的输入如上面图中。 114 | 9. 生成比特流,将其下载到 Nexys4 DDR 板,并验证功能。 115 | 116 | ##### 参考代码 117 | 118 | ```verilog 119 | module SR_latch_enable (input R, input S, input E, output Q, output Qbar); 120 | wire R_i,S_i; 121 | assign #2 R_i = R & E; 122 | assign #2 S_i = S & E; 123 | assign #2 Q = ~ (R_i | Qbar); 124 | assign #2 Qbar = ~ (S_i | Q); 125 | endmodule 126 | ``` 127 | 128 | Testbench: 129 | 130 | ```verilog 131 | module SR_latch_enable_tb(); 132 | reg R,S,E; 133 | wire Q,Qbar; 134 | SR_latch_enable TB (.R(R),.S(S),.E(E),.Q(Q),.Qbar(Qbar)); 135 | initial begin 136 | R = 0; 137 | S = 0; 138 | #10 S = 1; 139 | #20 S = 0; 140 | #10 R = 1; 141 | #20 R = 0; S = 1; 142 | #10 R = 1; S = 0; 143 | #10 R = 0; S = 1; 144 | end 145 | initial begin 146 | E = 0; 147 | #20 E = 1; 148 | #30 E = 0; 149 | #40 E = 1; 150 | end 151 | endmodule 152 | ``` 153 | 154 | #### 2-1-3. D 锁存器 155 | 156 | D 锁存器(D 源于”data”),也叫作透明锁存器,是门控 SR 锁存器的简单扩展,其消除了无效输入状态(亚稳态)的可能性。由于门控 SR 锁存器允许我们在不使用 S 或 R 输入的情况下锁存输出,我们可以通过使用互补驱动器驱动设置和复位输入来移除其中一个输入,即我们移除一个输入并自动使其成为另一个输入的互补输入。只要 Enable 线为高电平,D 锁存器就会输出 D 输入,否则输出是当 Enable 输入为最后一个高电平时 D 输入的输出。这就是为什么它也被称为透明锁存器 - 当 Enable 被置位时,锁存器被称为“透明” - 它信号直接传播通过它,好像它不存在一样。 157 | 158 |  159 | 160 |  161 | 162 | D 锁存器可以在行为建模中建模,如下所示: 163 | 164 | ```verilog 165 | module D_latch_behavior (input D, input Enable, output Q, output Qbar); 166 | always @ (D or Enable) if(Enable) 167 | begin 168 | Q <= D; 169 | Qbar <= ~D; 170 | end 171 | endmodule 172 | ``` 173 | 174 | 请注意,由于当 Enable 为低电平时我们没有做什么,电路会“记住”之前的状态。当 Enable 为高电平,由于 always 块也对 D 敏感,Q 和 Qbar 将随时更新 D,从而使其具有“透明”行为。另请注意,这里使用非阻塞赋值运算符(<=)代替已在数据流建模中使用的阻塞运算符(=)。本文档最后介绍了阻塞和非阻塞分配之间的区别。 175 | 176 | ##### 实验目的 177 | 178 | 使用数据流建模设计 D 锁存器(如上图所示)。合成设计并查看合成设计的原理图。实现一个 Testbench 进行测试并验证设计。模拟设计。将 D 输入分配给 SW0,并将输入分配给 SW1。将 Q 分配给 LED0,将 Qbar 分配给 LED1。实现设计并验证硬件中的功能。 179 | 180 | ##### 实验步骤 181 | 182 | 1. 打开 Vivado 并创建一个名为 lab5_1_3 的空白项目。 183 | 2. 创建并添加将使用数据流建模对 D 锁存器建模的 Verilog 模块。为模型中使用的每个赋值语句分配 2 个单位延迟。 184 | 3. 实现一个 Testbench 以测试和验证设计。它应该产生输入刺激。 185 | 186 | 若使用参考的 Testbench,得到的波形应该如下: 187 | 188 |  189 | 190 | 4. 将适当的板相关主 XDC 文件添加到项目中并编辑它以包 0 括相关引脚,将 D 输入分配给 SW0,将输入分配给 SW1,Q 分配给 LED0,Qbar 分配给 LED1。 191 | 5. 在“Bitstream Settings”中设置 tcl.pre 选项以指向提供的 lab5_prehook.tcl 文件。此文件允许将组合循环上载到电路板。 192 | 6. 合成设计并在 Synthesized Design 过程组下查看原理图。验证它使用 2 个 LUT 和 4 个 IO。 193 | 7. 实现设计并查看项目摘要。它应该显示 2 个 LUT 和 4 个 IO。 194 | 8. 生成比特流文件,将其下载到 Nexys4 DDR 板,并验证功能。 195 | 196 | ##### 参考代码 197 | 198 | ```verilog 199 | module D_latch_enable (input D, input Enable, output Q, output Qbar); 200 | wire Dbar,R_i,S_i; 201 | assign #2 Dbar = ~ D; 202 | assign #2 R_i = Dbar & Enable; 203 | assign #2 S_i = D & Enable; 204 | assign #2 Q = ~(R_i | Qbar); 205 | assign #2 Qbar = ~(Q | S_i); 206 | endmodule 207 | ``` 208 | 209 | ```verilog 210 | module D_latch_enable_tb(); 211 | reg D,E; 212 | wire Q,Qbar; 213 | D_latch_enable TB (.D(D),.Enable(E),.Q(Q),.Qbar(Qbar)); 214 | initial begin 215 | D = 0; 216 | #10 D = 1; 217 | #20 D = 0; 218 | #10 D = 1; 219 | #20 D = 0; 220 | #10 D = 1; 221 | #10 D = 0; 222 | #20 D = 1; 223 | #10 D = 0; 224 | end 225 | initial begin 226 | E = 0; 227 | #20 E = 1; 228 | #30 E = 0; 229 | #40 E = 1; 230 | end 231 | endmodule 232 | ``` 233 | 234 | ### 2-2. 触发器 235 | 236 | 在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当 CLK 到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器,以区别没有时钟信号控制的锁存器。 237 | 238 | #### 2-2-1. D 触发器 239 | 240 | D 触发器是一种广泛使用的触发器类型。它也被称为数据或延迟触发器。D 触发器在时钟周期的某一部分(例如时钟的上升沿)捕获 D 输入的值。捕获的值成为 Q 输出。在其他时候,输出 Q 不会改变。D 触发器可以被视为存储器单元或延迟线。触发器中的有效边沿可以为上升,也可为下降。又分为上升(也称为正)边沿触发 D 触发器和下降(负边沿)触发 D 触发器。 241 | 242 | 可以使用行为建模对正边沿触发的 D 触发器建模,如下所示: 243 | 244 | ```verilog 245 | module D_ff_behavior (input D, input Clk, output reg Q); 246 | always @ (posedge Clk) 247 | if(Clk) begin 248 | Q <= D; 249 | end 250 | endmodule 251 | ``` 252 | 253 | 请注意,always 块对 Clk 信号的上升沿很敏感。当敏感信号发生更改(事件)时,将执行 if 块中的语句。posedge 灵敏度使触发器行为成为可能。对于下降沿灵敏度使用属性 negedge。 254 | 255 | 通常需要让同步元素以定义的输出开始。在某些电路中,还需要强制同步元素到一个已知的输出,而忽略了 D 信号的输入。可以修改上面讨论的 D 触发器以具有这样的功能。如果在时钟的有效边沿上获得所需的输出,则这种 D 触发器被称为具有**同步置位**和复位功能的 D 触发器,否则它被视为具有异步预置和清除的 D 触发器。这样的 D 触发器可按照下面的方法实现: 256 | 257 | ```verilog 258 | module D_ff_with_synch_reset_behavior(input D, input Clk, input reset, output reg Q); // 同步置位和复位功能的D触发器 259 | always @(posedge Clk) 260 | if (reset) begin 261 | Q <= 1'b0; 262 | end 263 | else begin 264 | Q <= D; 265 | end 266 | endmodule 267 | ``` 268 | 269 | 在 FPGA 中,位于不同可配置逻辑块(CLB)中的 LUT 和 FF 使用路由资源连接。在实施过程中,工具将使用这些资源,具体取决于电路的建模方式,所需资源的类型和数量,以及电路的驱动速度。通常用于交换信息的资源是彼此靠近的;但是,可能存在无法实现的情况。当相关的触发器(信息交换之间)彼此远离时,到达源触发器和目标触发器的时钟可能不会同时产生所谓的时钟偏移。时钟偏移可以改变电路的行为。在某些其他情况下,某些触发器可能不需要在每个断言的时钟边沿更新其输出。为了控制行为,FPGA 中的触发器有一个额外的控制信号,称为时钟使能(CE)。在 ASIC 技术中,门控时钟用于控制行为。带有 CE 的触发器的符号如下所示: 270 | 271 |  272 | 273 | ##### 实验目的 274 | 275 | 使用行为建模对具有同步复位和时钟使能的 D 触发器进行建模。开发一个 testbench 进行测试(如图所示生成输入)并验证设计。仿真设计。将 D 输入分配给 SW0,复位到 SW1,ce 到 SW2,Clk 到 SW15,并将 Q 输出到 LED0。验证硬件设计。 276 | 277 | ##### 实验步骤 278 | 279 | 1. 打开 Vivado 并创建一个名为 lab5_2_4 的空白项目。 280 | 2. 创建并添加 Verilog 模块,该模块将使用同步复位和时钟使能对 D 触发器进行建模。 281 | 3. 开发 testbench 以测试和分析设计行为。它应该产生输入激励。 282 | 283 | 若使用供参考的 Testbench,得到的波形应该如下: 284 | 285 |  286 | 287 | 4. 将适当的板相关主 XDC 文件添加到项目中并编辑它以包括相关引脚,将 D 分配给 SW0,reset 为 SW1,ce 分配给 SW2,Clk 分配给 SW15,Q 分配给 LED0。 288 | 289 | ```shell 290 | set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets { clk }]; 291 | ``` 292 | 293 | 需要将上面的代码行添加到 XDC 文件中,以允许将 SW15 用作时钟。 294 | 295 | 5. 在“Bitstream Settings”中设置 tcl.pre 选项以指向提供的 lab5_prehook.tcl 文件。此文件允许将组合循环上载到电路板。 296 | 6. 合成并实现设计。查看项目摘要并注意使用了 1 个 BUFG 和 5 个 IO。使用 BUFG 是因为在设计中使用了时钟信号。 297 | 7. 生成比特流,将其下载到 Nexys4 DDR 板,并验证功能。 298 | 299 | ##### 参考代码 300 | 301 | ```verilog 302 | module D_ff_with_ce_and_synch_reset_behavior(input D, input Clk, input reset, input ce, output reg Q); 303 | always @(posedge Clk) 304 | if (reset) begin 305 | Q <= 1'b0; 306 | end 307 | else if (ce) begin 308 | Q <= D; 309 | end 310 | endmodule 311 | ``` 312 | 313 | ```verilog 314 | module D_ff_tb(); 315 | reg D,Clk,ce,reset; 316 | wire Q; 317 | D_ff_with_ce_and_synch_reset_behavior TB (.D(D),.Clk(Clk),.ce(ce),.reset(reset),.Q(Q)); 318 | initial begin 319 | D = 0; 320 | #20 D = 1; 321 | #80 D = 0; 322 | #120 D = 1; 323 | end 324 | initial begin 325 | Clk = 0; 326 | forever begin 327 | #10 Clk = 1; 328 | #10 Clk = 0; 329 | end 330 | end 331 | initial begin 332 | ce = 0; 333 | #60 ce = 1; 334 | #20 ce = 0; 335 | #100 ce = 1; 336 | #20 ce = 0; 337 | #60 ce = 1; 338 | #20 ce = 0; 339 | end 340 | initial begin 341 | reset = 0; 342 | #120 reset = 1; 343 | #20 reset = 0; 344 | end 345 | endmodule 346 | ``` 347 | 348 | #### 2-2-2. T 触发器 349 | 350 | 在数字电路中,另一种称为 T 或 Toggle 的触发器用于实现时钟分频器电路。它可用于将输入信号频率变为原来的 1/2.如果级联 n 个 T 触发器,则时钟分频为原来的 (1/2)^n。T 触发器具有 T 输入(数据),时钟输入,以及可选的复位和使能控制信号。 351 | 352 | ```verilog 353 | module clock_divider_behavior(input Clk, output reg Q); 354 | always @(negedge Clk) 355 | Q <= ~Q; 356 | endmodule 357 | ``` 358 | 359 | T 触发器还可以具有称为 CE(时钟使能)的控制信号,其将允许时钟分频仅在其时钟边沿时发生。以下代码模拟了 T 触发器的功能,该触发器对时钟的下降沿敏感,并具有低电平有效复位和高电平有效 T 控制信号。 360 | 361 | ```verilog 362 | module T_ff_enable_behavior(input Clk, input reset_n, input T, output reg Q); 363 | always @(negedge Clk) 364 | if (!reset_n) Q <= 1'b0; 365 | else if (T) Q <= ~Q; 366 | endmodule 367 | ``` 368 | 369 | ## 3. 总结 370 | 371 | ### 3-1. 同步异步问题 372 | 373 | 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 374 | 375 | 异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,这有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。 376 | 377 | 下面以 D 触发器为例子来讲述同步和异步之间的差别。 378 | 379 | 先用 verilog 描述一个异步的 D 触发器,即就是当时钟信号、复位信号或置位信号任一发生变化时,触发器都会随之发出响应。 380 | 381 | ```verilog 382 | module D_yb(input clk,input rst,input set,input d,output q); 383 | always @(posedge clk or negedge rst or negedge set) begin 384 | if(!rst) 385 | q<= 0; 386 | else if(!set) 387 | q<= 1; 388 | else 389 | q<=d; 390 | end 391 | endmodule 392 | ``` 393 | 394 | 再来描述一个同步的 D 触发器,当有时钟脉冲时才会做出响应,而 reset 和 set 发生时只会等时钟发生变化才会做出响应。 395 | 396 | ```verilog 397 | module D_tb(input clk,input rst,input ser,input d,output q); 398 | always @(poedge clk) begin 399 | if(rst) 400 | q<= 0; 401 | else if(set) 402 | q<=1; 403 | else 404 | q<=d; 405 | end 406 | endmodule 407 | ``` 408 | 409 | 有兴趣的同学们可以在测试用例中使用相同的信号,以方便观察两个触发器的区别。 410 | 411 | ### 3-2. 阻塞非阻塞赋值问题 412 | 413 | 阻塞赋值:在本语句中“右式计算”和“左式更新”全部完成之后,才开始执行下一条语句。 414 | 415 | 非阻塞赋值:当前语句的执行不会阻塞下一语句的执行。 416 | 417 | 例如,下面的例子使用了非阻塞赋值: 418 | 419 | ```verilog 420 | module nonblocking(input clk, input a,output reg c); 421 | reg b; 422 | always @(posedge clk) begin 423 | b <= a; 424 | c <= b; 425 | end 426 | endmodule 427 | ``` 428 | 429 | 实现出来的 RTL 原理图如下: 430 | 431 |  432 | 433 | 这是因为在每个 clk 的上升沿,电路并发实现两条非阻塞赋值语句,所以需要两个 D 触发器。 434 | 435 | 而下面的例子和上个例子几乎完全一样,只是把非阻塞赋值改成了阻塞赋值,如下: 436 | 437 | ```verilog 438 | module blocking(input clk, input a,output reg c); 439 | reg b; 440 | always @(posedge clk) begin 441 | b = a; 442 | c = b; 443 | end 444 | endmodule 445 | ``` 446 | 447 | 实现出来的 RTL 原理图如下: 448 | 449 |  450 | 451 | 事实上,由于在每个时钟周期上升沿执行完这个 begin-end 块语句后,b 和 c 的值完全一样,所以 RTL 中就把 b 给优化掉了。 452 | 453 | 如果你还有更多探索的兴趣,可以先试试把上面的例子中 b = a; c = b; 的顺序交换一下,再把实现出来的结果和非阻塞赋值例子的结果相比较,看看是不是相同。 454 | -------------------------------------------------------------------------------- /docs/doc_testbench.md: -------------------------------------------------------------------------------- 1 | # Testbench 的编写与应用 2 | 3 | ## 1. Testbench 的概念 4 | 5 | Testbench 是一种用任意语言编写的程序或模块,用于在模拟过程中执行和验证硬件模型的功能正确性。Verilog 主要用于硬件建模(模拟),该语言包含各种资源,用于格式化,读取,存储,动态分配,比较和写入模拟数据,包括输入激励和输出结果。 6 | 7 | ## 2. Testbench 的组成组件 8 | 9 | Testbench 的主要组件如下: 10 | 11 | 1. 时间表声明:指定所有延迟的时间单位 12 | 13 | 2. Module:它定义了测试文件的 top 模块,测试文件的 top 模块通常没有输入输出端口,测试是直接监控寄存器和线网这些内部信号的活动 14 | 15 | 3. 内部信号:它将驱动激励信号进入 UUT 并监控 UUT 的响应,信号驱动和监控 16 | 17 | 4. UUT 实例化 18 | 19 | 5. 激励生成:编写语句以创建激励和程序块 20 | 21 | 6. 响应监控和比较:自我测试语句,能报告数值,错误和警告 22 | 23 | 下面,具体展开这其中的一些组件如何实现。其余组件参照[使用 Testbench 的一个例子](#example)。 24 | 25 | ### 2-1. Testbench 的延迟建模 26 | 27 | Verilog 支持两种类型的延迟建模:(i)惯性和(ii)传输。惯性延迟是门(gate)或电路由于其物理特性而可能经历的延迟。根据所使用的技术,它可以是 ps 或 ns。惯性延迟还用于确定输入是否对门或电路有影响。如果输入至少在初始延迟时没有保持变化,则忽略输入变化。例如,5 ns 的惯性延迟意味着无论何时输入发生变化,它都应保持至少 5 ns 的变化,以使其被视为已更改,否则将忽略该变化(被视为噪声尖峰)。 28 | 传输延迟是传输电路导线的信号的飞行时间。以下是运输和惯性延迟的示例: 29 | 30 | ```verilog 31 | wire #2 a_long_wire; // 运输延迟两单元时间 32 | xor #1 M1(sum, a, b); // 惯性延迟1单元时间 33 | ``` 34 | 35 | ### 2-2. Testbench 中的初始语句 36 | 37 | 初始语句在 testbenchs 中用于生成激励和控制仿真执行。参照下面的一个例子: 38 | 39 | ```verilog 40 | initial begin 41 | #100 $finish; // run simulation for 100 units 42 | end 43 | 44 | initial begin 45 | #10 a=0; b=0; // a, b zero after 10 units delay. Between 0 and 10, 46 | // it is x 47 | #10 b=1; // At 20, make b=1 48 | #10 a=1; // at 30, make a=1 49 | #10 b=0; // at 40, make b=0 50 | end 51 | ``` 52 | 53 | 下面是生成称为时钟的周期信号的初始语句用法的另一个示例。它将产生 50%占空比的时钟信号,周期为 20 个单位。 54 | 55 | ```verilog 56 | reg clock; 57 | parameter half_cycle = 10; 58 | initial begin 59 | clock = 0; 60 | forever begin 61 | #half_cycle clock = 1; 62 | #half_cycle clock = 0; 63 | end 64 | end 65 | ``` 66 | 67 | ## 3. 使用 Testbench 的一个例子 {#example} 68 | 69 |  70 | 71 | 第 1 行定义了`timescale 指令。 72 | 73 | 第 2 行和第 3 行定义了测试平台模块名称。请注意,通常,testbench 模块的端口列表中不列出端口。 74 | 75 | 第 5 行将拨动开关定义为 reg 数据类型,因为它将用于提供激励。它连接到被测试(tutorial)的实例化设备。 76 | 77 | 第 11 行使用实例名称 tut1 和输入/输出端口实例化测试(tutorial)中的设计。 78 | 79 | 第 13 行到第 22 行定义了计算预期输出的 function。 80 | 81 | 第 24 至 35 行使用 initial 过程描述来定义激励。可以在仿真器控制台窗口中使用 system task $ display 来查看第 31 行和第 33 行生成的消息。 82 | 83 | 第 29 行通过传递开关参数调用函数 expected_led,并将返回的(计算过的)输出分配给 e_led。e_led 在第 7 行定义为 reg 类型,因为它在过程语句(初始)中接收函数调用的输出。 84 | 85 | 第 28 和 29 行还分别定义惯性延迟 50 和 10,以模拟延迟。 86 | 87 | ## 4. 开发一个生成特定波形的 Testbench 88 | 89 | 开发一个 testbench,生成如下所示的波形。 90 | 91 |  92 | 93 | ### 实验步骤 94 | 95 | 1. 打开 Vivado 并创建一个名为 Testbench 的空白项目。 96 | 97 | 2. 创建并添加输出上面显示的波形的 Verilog 模块。 98 | 99 | 3. 将设计模拟 150 ns 并验证是否生成了正确的输出。 100 | 101 | ### 参考代码 102 | 103 | ```verilog 104 | module Testbench(); 105 | reg A,G1,G2; 106 | initial begin 107 | A = 0; 108 | G1 = 0; 109 | G2 = 1; 110 | #40 A = 1; 111 | #20 G1 = 1; 112 | #20 G2 = 0; 113 | #20 A = 0; 114 | #20 G1 = 0; 115 | #20 G2 = 1; 116 | end 117 | endmodule 118 | ``` 119 | -------------------------------------------------------------------------------- /docs/doc_verilog.md: -------------------------------------------------------------------------------- 1 | # Verilog 语法入门 2 | 3 | Verilog HDL 是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL 和 VHDL 是世界上最流行的两种硬件描述语言,都是在 20 世纪 80 年代中期开发出来的。前者由 Gateway Design Automation 公司(该公司于 1989 年被 Cadence 公司收购)开发。两种 HDL 均为 IEEE 标准。 4 | 5 | Verilog 可以从五个层次对电路(系统)进行描述,包括:系统级、算法级、寄存器传输级(即 RTL 级)、门级、开关级。我们平时用的最多的为 RTL 级,故 Verilog 代码也经常被称为 RTL 代码。 6 | 7 | 在笔者看来,掌握一门语言最快速的方法就是在实际应用中去学习,Verilog HDL 也不例外。下面我们就通过一系列实例来学习 Verilog HDL。 8 | 9 | ### 1.1 简单组合逻辑电路 10 | 11 | 对于逻辑表达式: 12 | 13 |  14 | 15 | 其电路图如下所示: 16 | 17 |  18 | 19 | Verilog 代码如下: 20 | 21 |  22 | 23 | 语法说明 24 | 25 | `module` / `endmodule` 26 | 27 | : 表征模块的开始与结束。 28 | 29 | `example` 30 | 31 | : 模块名可由用户指定,可包含字母、数字及下划线,需以字母开头,区分大小写 32 | 33 | `assign` 34 | 35 | : 赋值操作关键字,该关键字后可跟一个赋值表达式,该关键字是实现组合逻辑操作的一种主要描述方式。 36 | 37 | `input` / `output` 38 | 39 | : 表征该信号的方向,除输入、输出外还有一种 `inout`(输入输出)型。 40 | 41 | 操作符 42 | 43 | : `~`按位取反、`&` 按位与、`|` 按位或。 44 | 45 | 常用操作符及其优先级: 46 | 47 |  48 | 49 | 建议大家在写代码时,在适当的地方加上括号,以增加可读性 50 | 51 | 综合后电路: 52 | 53 |  54 | 55 | 上图是综合工具生成的电路图,大家可以自行化简上述电路,看是否等价。 56 | 57 | ### 1.2 多 bit 逻辑门 58 | 59 | 对于下面 5 个逻辑表达式 60 | 61 | ```verilog 62 | y1 = a & b; 63 | y2 = a | b; 64 | y3 = a ^ b; 65 | y4 = ~(a & b); 66 | y5 = ~(a | b); 67 | ``` 68 | 69 | 其电路图如下所示: 70 | 71 |  72 | 73 | Verilog 代码为: 74 | 75 |  76 | 77 | 语法说明: 78 | 79 | `[3:0]` 80 | 81 | : 表征该信号的位宽,实例中是推荐写法,`[0:3]`、`[4:1]` 等写法也是合法的 82 | 83 | `//`、`/* */` 84 | 85 | : 代码注释,增加代码可读性,`//` 为单行注释,`/* */` 为多行注释 86 | 87 | ### 1.3 八输入与门 88 | 89 | 对于逻辑表达式 90 | 91 | ```verilog 92 | y = a[7] & a[6] & a[5] & a[4] & a[3] & a[2] & a[1] & a[0]; 93 | ``` 94 | 95 | 其电路图为: 96 | 97 |  98 | 99 | Verilog 代码: 100 | 101 |  102 | 103 | 语法说明: 104 | 105 | `a[7]` 106 | 107 | : 可将一个多位宽信号中的一位或多位以此种方式进行单独处理 108 | 109 | `&` 110 | 111 | : 按位与、归并与操作,如该操作符只有一个操作数时,则将该操作数的所有位进行相与操作,可以实现与注释部分相同的功能,但写法更简洁。 112 | 113 | ### 1.4 一位全加器 114 | 115 | 对于表达式 116 | 117 | ```verilog 118 | {cout, s} = a + b + cin; 119 | ``` 120 | 121 | 其电路图为: 122 | 123 |  124 | 125 | Verilog 代码 126 | 127 |  128 | 129 | 语法说明 130 | 131 | `wire` 132 | 133 | : 线网型数据类型,Verilog 语法中的一种主要数据类型,用于表示线网型信号,与实际电路中的信号连线相对应。wire 是 Verilog 中的默认数据类型,此例中的输入输出信号没有指定数据类型,则默认为 wire 型。除 wire 外,另外一种主要数据类型为 `reg`,表示寄存器类型数据。 134 | 135 | 内部信号 136 | 137 | : 此例中的 `p`、`g` 为内部信号,可以简化设计,增加代码可读性。 138 | 139 | ### 1.5 三态门 140 | 141 | 电路图 142 | 143 |  144 | 145 | Verilog 代码 146 | 147 |  148 | 149 | 语法说明: 150 | 151 | `z` 152 | 153 | : 高阻态,Verilog 中,信号共有 4 种状态 `0`、`1`、`x`、`z`,分别表示低电平、高电平、不确定态和高阻态。对于没有进行初始化的信号,一般处于不确定态(x),高阻态表示该信号没有被其他信号驱动,经常用于有多个驱动源的总线型数据上。 154 | 155 | `4'bz` 156 | 157 | : 数据格式,表示该信号为 4 bit 位宽,用二进制方式表示,对于数据格式的进一步说明,可见下表 158 | 159 |  160 | 161 | ### 1.6 八位两路选择器 162 | 163 | 电路图: 164 | 165 |  166 | 167 | Verilog 代码: 168 | 169 |  170 | 171 | 语法说明: 172 | 173 | 模块例化 174 | 175 | : 可通过实例化已经设计好的模块来达到重用模块,简化设计的目的。可将一个模块重用多次,在同一模块中,实例化名称(本例中为 lsbmux、msbmux)可任意指定,但不能相同,也不能使用 Verilog 中的关键字。本例中列举了 Verilog 语法支持的两种实例化方式,推荐使用第二种方式,虽然代码量增加了一些,但增加了可读性,同时降低了出错的风险。 176 | 177 | 对于第一种模块例化方法,应严格保证实例化模块(lsbmux)中的参数排列顺序与被实例化模块(mux2)的参数排列顺序严格一致。 178 | 179 | 对于第二种方式点后面是被例化模块(mux2)的接口信号,括号内的是实例化模块(msbmux)的接口信号。 180 | 181 |  182 | 183 | 位拼接 184 | 185 | : 可将一个或多个信号的指定位,拼接成一个新的信号,对于上述表达式,如果 y 是一 12 bit 的信号,则其各位的值为: 186 | 187 | ```verilog 188 | a[2] a[1] b[0] b[0] b[0] a[0] 1 0 0 0 1 0 189 | ``` 190 | 191 | 下划线 192 | 193 | : 数字中间的下划线是为了增加程序可读性,可直接将其忽略。 194 | 195 | ### 1.7 D 触发器 196 | 197 | 电路图: 198 | 199 |  200 | 201 | Verilog 代码: 202 | 203 |  204 | 205 | 语法说明: 206 | 207 | 时序逻辑 208 | 209 | : 电路具有记忆功能,电路状态不但与当前输入有关,还与前一时刻的状态有关。 210 | 211 | 同步逻辑 212 | 213 | : 在同一的时钟信号激励下工作,输出只在时钟的上升沿(或者下降沿)发生变化。 214 | 215 | `reg` 216 | 217 | : 除 wire 类型外,另外一种常用的数据类型,一般表示寄存器类型数据,不过并不绝对,记住一条原则:在 always 块内被赋值的信号应定义成 reg 型,用 assign 语句赋值的信号应定义成 wire 型。 218 | 219 | `always` 220 | 221 | : 除 assign 外,另外一种实现赋值操作的关键字,两者都不可嵌套,区别在于,assign 语句只能实现组合逻辑赋值,且一个 assign 语句后面只能跟一条赋值表达式。而 always 即能实现组合逻辑赋值,又能实现时序逻辑赋值操作,且可以包含多条赋值表达式,多条赋值表达式,则应位于 begin/end 对中间。 222 | 223 |  224 | 225 |  226 | 227 | `posedge` 228 | 229 | : Verilog 关键字,表示上升沿的意思。`always @(posedge clk)` 表示在 clk 信号的上升沿的时刻,执行 always 块内部的语句,与此相对应的,是表示下降沿的关键字 negedge。凡是带有 posedge 或 negedge 的 always 块,都会被综合成时序逻辑电路。 230 | 231 | 阻塞/非阻塞赋值 232 | 233 | : 采用 `<=` 进行赋值的语句,称为“非阻塞赋值”,采用 `=` 进行赋值的语句,称为“阻塞赋值”。在 always 块中,阻塞式赋值方式语句执行有先后顺序,而非阻塞赋值语句则是同时执行。因此,在时序逻辑电路中,两种赋值方式可能或综合出不同的电路结构。如下所示 234 | 235 |  236 | 237 |  238 | 239 | 显然,第二种电路才是符合我们预期的设计,为避免出现一些稀奇古怪的电路,我们只需记住以下规则: 240 | 241 | 1. 在组合逻辑电路中,使用阻塞式赋值方式 `=`。 242 | 243 | 2. 在时序逻辑电路中,使用非阻塞式赋值方式 `<=`。 244 | 245 | 3. 在同一个 always 块内,只能存在一种赋值方式。 246 | 247 | 4. 一个信号,只能在一个 always 或一个 assign 语句下赋值。 248 | 249 | 5. 原则上来说,一个 always 块内只处理一个或一类信号,不同的信号可在不同的 always 块内处理。 250 | 251 | 6. always 块内只能对 reg 型信号进行处理,不能对 wire 型数据赋值,也不能实例化模块。 252 | 253 | ### 1.8 带同步复位的 D 触发器 254 | 255 |  256 | 257 | Verilog 代码 258 | 259 |  260 | 261 | 语法说明: 262 | 263 | 同步复位 264 | 265 | : 复位只能发生在在 clk 信号的上升沿,若 clk 信号出现问题,则无法进行复位。 266 | 267 | `if` / `else` 268 | 269 | : always 块中常用的条件判断语句,可以嵌套,有优先级,一般来说,应将复位处理逻辑放在第一个 if 语句下,使其具有最高的优先级,该语句只能在 always 块内使用。另外一种比较常用的条件判断语句是 case。与 if/else 语句不同,case 语句不带优先级 270 | 271 | ### 1.9 异步复位电路 272 | 273 |  274 | 275 | Verilog 代码 276 | 277 |  278 | 279 | 语法说明: 280 | 281 | 异步复位 282 | 283 | : 在 always 的敏感变量列表中,包含了 posedge clk(clk 信号上升沿)和 posedge reset(reset 信号下降沿)两个条件,只要有一个条件发生,便会执行 always 块内的逻辑。复位处理逻辑应具有最高的优先级。 284 | 285 | 用 always 块实现组合逻辑 286 | 287 | Verilog 代码 288 | 289 |  290 | 291 | 语法说明: 292 | 293 | - always 块内被赋值的信号应定义成 reg 类型,即使此信号在实际电路中是线型。 294 | - always 语句实现组合逻辑应采用阻塞赋值方式。 295 | 296 | ### 1.10 七段数码管 297 | 298 | 电路图 299 | 300 | 我们最常用的是七段式和八段式 LED 数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小 LED 发光二极管,通过控制不同的 LED 的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个 LED 的阴极连在一起,让其接地,这样给任何一个 LED 的另一端高电平,它便能点亮。而共阳极就是将八个 LED 的阳极连在一起。其原理如下图 301 | 302 |  303 | 304 | Verilog 代码 305 | 306 |  307 | 308 | 语法说明: 309 | 310 | `case` 311 | 312 | : case 语句的各个条件之间没有优先级,且各条件应是互斥的。在组合逻辑电路中使用 case 语句最后应加上 default 语句,以防综合出锁存器电路。 313 | 314 | ### 1.11 有限状态机(FSM) 315 | 316 | 有限状态机(以下简称 FSM)在数字电路系统中具有举足轻重的低位,很多控制逻辑都是基于 FSM 来实现的。FSM 在设计实现上,可以分成一段式、两段式、三段式三种。由于三段式具有条理清晰、可读性强,因此多数采用此种设计方式,下面是其电路简图。 317 | 318 |  319 | 320 | 我们以设计具有 3 个状态的简单状态机为例来进行讲解。 321 | 322 |  323 | 324 | Verilog 代码: 325 | 326 |  327 | 328 | 其中,第一个 always 为 FSM 的第一段;第二个 always 块为 FSM 的第二段;最后的 assign 语句为 FSM 的第三段。如有多个信号,可继续使用 assign 或 always 语句进行处理。 329 | 330 | ### 1.12 参数传递 331 | 332 | 在例化模块时,可以通过参数传递的方式改变被例化模块的部分参数 333 | 334 |  335 | 336 | 如要例化一 8 bit 位宽的选择器,则使用默认参数即可,不需进行参数传递 337 | 338 |  339 | 340 | 如要例化一 12 bit 位宽的选择器,则可使用如下方式,将参数传递过去 341 | 342 |  343 | 344 | ### 1.14 测试文件 345 | 346 | 要测试我们设计的模块功能是否正常,最直接的办法就是烧写到 FPGA 芯片中进行验证,但是这种方式往往结果并不直观,且出现问题后也不容易定位。为提高工作效率,我们可通过电脑仿真的方式进行功能验证,待仿真通过后,再烧写到 FPGA 中,这样可以快速排除电路中存在的绝大多数 bug。在电脑上进行仿真,除了我们设计的功能模块之外,还需要另一模块——testbench,用于产生被测模块所需的激励信号。由于 testbench 只是用于电脑端的仿真,而不需要最终综合成电路,因此其写法更加灵活,可以使用 verilog 语法中的一些不可综合的语句,如 `initial`、`#`、`$display`、`$readmemb`、`forever` 等。 347 | 348 | 假设我们的被测模块完成以下功能 349 | 350 |  351 | 352 | 其 verilog 代码为: 353 | 354 |  355 | 356 | #### 1.14.1 简单测试文件 357 | 358 | 最简单的测试文件可以写成如下形式: 359 | 360 |  361 | 362 | 语法说明: 363 | 364 | testbench 文件一般不包含任何输入输出信号 365 | 366 | 将被测模块实例化,被测模块的输入信号定义成 reg 类型,输出信号定义成 wire 类型。 367 | 368 | `initial` 369 | 370 | : 通过 initial 块构造输入信号的波形,同一 initial 块内部的语句是串行执行的,多个 initial 块之间并发执行。 371 | 372 | #### 1.14.2 自检测试文件 373 | 374 | 带自检功能的测试文件如下所示,可以对输出结果进行判断,并打印错误信息 375 | 376 |  377 | 378 | 模块的输入信号给定之后,就有有结果输出,将实际输出结果于预期结果做比较,如果不同,则打印出错误信息。 379 | 380 | #### 1.14.3 测试向量 381 | 382 | 通过测试向量进行仿真 383 | 384 | 将输入信号的各种组合以及对应的输出结果构成一测试向量,则每个向量中都包含了一种输入状态,以及该状态下的期望输出结果 385 | 386 | 将该向量导入一内存数组 387 | 388 | 构造一时钟信号 389 | 390 | 在时钟的上升沿,将一个向量赋值给被测模块输入端,并在时钟的下降沿对被测模块输出与期望输出结果进行对比,如果不相同,则记录下该向量,至此向量全部测试完毕。 391 | 392 | 向量测试文件(`example.tv`)包含 `a`、`b`、`c` 以及 `y_expected` 393 | 394 | ```verilog 395 | 000_1 396 | 001_0 397 | 010_0 398 | 011_0 399 | 100_1 400 | 101_1 401 | 110_0 402 | 111_0 403 | ``` 404 | 405 | 测试文件 406 | 407 |  408 | 409 | 前面介绍了三种测试方法,三种方法各有其优缺点。 410 | 411 | 简单测试文件编写简单,容易上手,但需要人工判断仿真结果的正确性; 412 | 413 | 带自检的测试文件可以将错误信息打印出来,但编写稍微复杂一些,且激励波形仍需通过人工输入代码来完成; 414 | 415 | 测试向量法测试文件编写最为复杂,还需要编写一个用于跟被测模块结果进行比较的黄金模型,但此种方法测试最为充分,且后续维护起来也最容易。 416 | -------------------------------------------------------------------------------- /docs/doc_vivado.md: -------------------------------------------------------------------------------- 1 | # Vivado 安装和使用 2 | 3 | ## 1. vivado 安装 4 | 5 | 首先下载 vivado webpack installer,目前最新版本为 2019.1。 6 | 7 | 开始安装,可以选择 VIvado HL Webpack 版本点击 next 继续安装。 8 | 9 |  10 | 11 | 接下来的一步可以使用默认选项继续安装,但是这样占用的存储空间比较大。也可以使用如用所示的最小安装方式。 12 | 13 |  14 | 15 | 接下来就是比较漫长的安装过程了。你可以先做其他事情,等会再来瞅一下。 16 | 17 | ## 2. Vivado 使用 18 | 19 | 本使用指南将指导读者在 Xilinx Vivado 环境下,使用 Verilog HDL 语言设计一个简单的数字电路样例。一个典型的设计流程包括创建 model,创建用户约束文件,创建 Vivado 项目,导入已创建的 model,编译约束文件,选择性调试运行时的行为仿真,综合你的 design,实现 design,生成 bitstream 文件,最后将 bitstream 文件下载到硬件中,并确认硬件能否正确的实现功能。读者即将学习的设计流程将基于 Artix-7 芯片的 Basys3 基板和 Nexys4 DDR 基板。一个典型的设计流程如下图所示,画圈数字的顺序将和本指南中的指导步骤的顺序一致。 20 | 21 |  22 | 23 | ### 2-1. 目标 24 | 25 | 在完成了本指南的所有内容后,你应该具备以下能力: 26 | 27 | 1. 创建一个采用 HDL 模型的 Vivado 项目,并针对位于 Basys3 和 Nexys4 DDR 板上的特定 FPGA 器件进行开发 28 | 2. 使用提供的已部分完成的 Xilinx Design Constraint (XDC) 文件来约束某些引脚的位置 29 | 3. 使用 Vivado 的 Tcl 脚本功能来增加额外的约束 30 | 4. 使用 XSim 仿真器来仿真你的设计 31 | 5. 综合并实现你的设计 32 | 6. 生成 bitstream 文件 33 | 7. 使用已生成的 bitstream 文件配置 FPGA 设备并确认功能 34 | 35 | ### 2-2. 流程 36 | 37 | 若要实现以上的目标,就请你按照下面的步骤完整做一遍。以下是 2015.1 版本的教程,但是和 2019.1 的步骤是差不多的。 38 | 39 | #### 2-2-1. 使用 IDE 创建 Vivado 项目 40 | 41 | 启动 Vivado 并创建一个针对 `xc7a35tcpg236-1`(Basys3)或者 `xc7a100tcsg324-1`(Nexys4 DDR)设备的项目,并使用 Verilog HDL 语言。使用在 sources / tutorial 目录中提供的 `tutorial.v` 和 `Nexys4DDR_Master.xdc` or `Basys3_Master.xdc` 文件。 42 | 43 | 1. 打开 Vivado → Start → All Programs → Xilinx Design Tools → Vivado 2015.1 → Vivado 2015.1。 44 | 45 | 2. 单击“Create New Project”以启动向导。你将看到“Create A New Vivado Project”对话框。点击 Next。 46 | 47 | 3. 单击 New Project 窗体的 Project location 字段的 Browse 按钮,浏览到 `C:\xup\digital`,然后单击 Select。 48 | 49 | 4. 在 Project name 中输入 tutorial。确保选中“Create Project Subdirectory”框,点击 Next。 50 | 51 |  52 | 53 | 1. 在 Project Type 表单中选择 RTL Project,点击 Next。 54 | 2. 在 Add Sources 表单中选择 Verilog 作为 Target language 和 Simulator language。 55 | 3. 单击 Green Plus 按钮,然后单击 Add Files...按钮,浏览到 `C:\xup\digital\sources\tutorial` 目录,选择 `tutorial.v`,单击 Open,并确认已选中 Copy sources into project,然后单击 Next。 56 | 4. 因为我们没有在此设计中使用任何预先固定的 IP,故单击 Add Existing IP form 表单中的 Next 57 | 5. 在 Add Constraints 表单中,单击 Green Plus 按钮,然后单击 Add Files ...按钮,浏览到 `C:\xup\digital\sources\tutorial` 目录,选择 `Basys3_Master.xdc`(对应 Basys3)或 `Nexys4DDR_Master.xdc`(对应 Nexys4 DDR),单击 Open,然后单击 Next。XDC 约束文件将 FPGA 上的物理 IO 位置分配给主板上的开关和 LED。这些信息可以通过电路板的原理图或电路板的用户指南获得。 58 | 6. 在 Default Part 表单中,使用 Parts 选项和 Fliter 部分的各种下拉字段,选择 `xc7a35tcpg236-1` part(对于 Basy3)或 `xc7a100tcsg324-1` part(对于 Nexys4DDR)。点击 Next。 59 | 60 |  61 | 62 |  63 | 64 | 1. 单击 Finish 以创建 Vivado 项目。使用 Windows 资源管理器并查看 `C:\xup\digital\tutorial` 目录。你将看到 `tutorial.srcs` 和其他目录以及 `tutorial.xpr`(Vivado)项目文件已创建。在 `tutorial.srcs` 目录下创建了两个子目录 `constrs_1` 和 `sources_1`;在它们的下方,分别放置了复制的 `Nexys4DDR_Master.xdc` 或 `Basys3_Master.xdc`(约束)和 `tutorial.v`(源)文件。 65 | 66 | #### 2-2-2. 打开 tutorial.v 文件并分析内容 67 | 68 | 1. 在 Sources 窗格中,双击 tutorial.v 条目以在文本模式下打开文件。 69 | 70 |  71 | 72 | 1. 请注意,在 Verilog 代码中,第一行定义了仿真器的 timescale 指令。第 2-5 行是描述模块名称和模块用途的注释行 73 | 74 | 2. 第 7 行定义了开头(用关键字 module 标记),第 19 行定义了模块的结尾(用关键字 endmodule 标记)。 75 | 76 | 3. 第 8-9 行定义输入和输出端口而第 12-17 行定义实际功能。 77 | 78 | #### 2-2-3. 打开 Basys3_Master.xdc 或 Nexys4DDR_Master.xdc 源,分析内容并编辑文件 79 | 80 | 1. 在 Sources 窗 格 中,展 开 Constraints 文 件 夹,然 后 双 击 Basys3_Master.xdc(Basys3)或 Nexys4DDR_Master.xdc(Nexys4 DDR)条目以在文本模式下打开文件。 81 | 82 |  83 | 84 | 1. 通过删除#符号或突出显示 `SW[7:0]` 并按 Ctrl / 来取消注释 `SW[7:0]`。取消注释 `LED[7:0]`,引脚名称需要进行更改,以匹配 tutorial.v 文件中的引脚名称。将 sw 更改为 swt,将 LED 更改为 led。 85 | 86 |  87 | 88 |  89 | 90 |  91 | 92 | 1. 将 `sw[*]` 名称更改为 `swt[*]`,将 `LED[*]` 更改为 `led[*]`,因为模型中的端口名称是 swt 和 led。 93 | 2. 关闭并保存文件。 94 | 95 | #### 2-2-4. 对源文件执行 RTL 分析 96 | 97 | 1. 展开 Flow Navigator 窗格的 RTL Analysis 任务下的 Open Elaborated Design 条目,然后单击 Schematic。 98 | 99 | 2. 单击 OK 以运行分析。将详细说明模型(设计)并显示设计的逻辑视图。 100 | 101 |  102 | 103 | 请注意,某些开关输入会通过逻辑门后再被输出到 LED,而其余部分将和文件中的模型一样直接输出到 LED。 104 | -------------------------------------------------------------------------------- /docs/images/basic_logic/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/1.png -------------------------------------------------------------------------------- /docs/images/basic_logic/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/10.png -------------------------------------------------------------------------------- /docs/images/basic_logic/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/11.png -------------------------------------------------------------------------------- /docs/images/basic_logic/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/12.png -------------------------------------------------------------------------------- /docs/images/basic_logic/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/13.png -------------------------------------------------------------------------------- /docs/images/basic_logic/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/14.png -------------------------------------------------------------------------------- /docs/images/basic_logic/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/15.png -------------------------------------------------------------------------------- /docs/images/basic_logic/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/16.png -------------------------------------------------------------------------------- /docs/images/basic_logic/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/17.png -------------------------------------------------------------------------------- /docs/images/basic_logic/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/18.png -------------------------------------------------------------------------------- /docs/images/basic_logic/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/19.png -------------------------------------------------------------------------------- /docs/images/basic_logic/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/2.png -------------------------------------------------------------------------------- /docs/images/basic_logic/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/20.png -------------------------------------------------------------------------------- /docs/images/basic_logic/2to1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/2to1.png -------------------------------------------------------------------------------- /docs/images/basic_logic/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/3.png -------------------------------------------------------------------------------- /docs/images/basic_logic/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/4.png -------------------------------------------------------------------------------- /docs/images/basic_logic/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/5.png -------------------------------------------------------------------------------- /docs/images/basic_logic/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/6.png -------------------------------------------------------------------------------- /docs/images/basic_logic/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/7.png -------------------------------------------------------------------------------- /docs/images/basic_logic/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/8.png -------------------------------------------------------------------------------- /docs/images/basic_logic/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/9.png -------------------------------------------------------------------------------- /docs/images/basic_logic/Nexys4_DDR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/Nexys4_DDR.png -------------------------------------------------------------------------------- /docs/images/basic_logic/schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/schematic.png -------------------------------------------------------------------------------- /docs/images/basic_logic/schematic1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/schematic1.png -------------------------------------------------------------------------------- /docs/images/basic_logic/shuju.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/shuju.png -------------------------------------------------------------------------------- /docs/images/basic_logic/xingwei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/basic_logic/xingwei.png -------------------------------------------------------------------------------- /docs/images/complex_logic/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_logic/1.png -------------------------------------------------------------------------------- /docs/images/complex_logic/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_logic/2.jpg -------------------------------------------------------------------------------- /docs/images/complex_logic/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_logic/3.jpg -------------------------------------------------------------------------------- /docs/images/complex_logic/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_logic/4.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563615302529.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563615302529.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563671799092.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563671799092.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563673253101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563673253101.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563675030296.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563675030296.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563675258127.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563675258127.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563675293716.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563675293716.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563675335903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563675335903.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563675367351.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563675367351.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563680366835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563680366835.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563683217154.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563683217154.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563720971518.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563720971518.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563721124688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563721124688.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563721348108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563721348108.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563722138731.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563722138731.png -------------------------------------------------------------------------------- /docs/images/complex_timing/1563975225313.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/1563975225313.png -------------------------------------------------------------------------------- /docs/images/complex_timing/structure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/complex_timing/structure.jpg -------------------------------------------------------------------------------- /docs/images/finite_state_machine/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/1.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/2.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/3.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/4.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/5.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/6.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/7.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/8.png -------------------------------------------------------------------------------- /docs/images/finite_state_machine/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/finite_state_machine/9.png -------------------------------------------------------------------------------- /docs/images/fpga/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/1.png -------------------------------------------------------------------------------- /docs/images/fpga/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/10.png -------------------------------------------------------------------------------- /docs/images/fpga/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/11.png -------------------------------------------------------------------------------- /docs/images/fpga/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/12.png -------------------------------------------------------------------------------- /docs/images/fpga/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/13.png -------------------------------------------------------------------------------- /docs/images/fpga/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/14.png -------------------------------------------------------------------------------- /docs/images/fpga/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/15.png -------------------------------------------------------------------------------- /docs/images/fpga/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/16.png -------------------------------------------------------------------------------- /docs/images/fpga/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/17.png -------------------------------------------------------------------------------- /docs/images/fpga/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/18.png -------------------------------------------------------------------------------- /docs/images/fpga/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/2.png -------------------------------------------------------------------------------- /docs/images/fpga/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/3.png -------------------------------------------------------------------------------- /docs/images/fpga/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/4.png -------------------------------------------------------------------------------- /docs/images/fpga/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/5.png -------------------------------------------------------------------------------- /docs/images/fpga/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/6.png -------------------------------------------------------------------------------- /docs/images/fpga/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/7.png -------------------------------------------------------------------------------- /docs/images/fpga/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/8.png -------------------------------------------------------------------------------- /docs/images/fpga/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/fpga/9.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim1.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim10.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim11.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim12.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim13.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim14.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim15.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim16.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim17.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim18.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim19.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim2.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim20.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim21.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim22.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim23.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim24.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim25.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim3.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim4.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim5.png -------------------------------------------------------------------------------- /docs/images/logisim/logisim6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim6.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim7.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim8.gif -------------------------------------------------------------------------------- /docs/images/logisim/logisim9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/logisim/logisim9.gif -------------------------------------------------------------------------------- /docs/images/nexys/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/1.png -------------------------------------------------------------------------------- /docs/images/nexys/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/10.png -------------------------------------------------------------------------------- /docs/images/nexys/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/11.png -------------------------------------------------------------------------------- /docs/images/nexys/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/12.png -------------------------------------------------------------------------------- /docs/images/nexys/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/13.png -------------------------------------------------------------------------------- /docs/images/nexys/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/14.png -------------------------------------------------------------------------------- /docs/images/nexys/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/15.png -------------------------------------------------------------------------------- /docs/images/nexys/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/16.png -------------------------------------------------------------------------------- /docs/images/nexys/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/17.png -------------------------------------------------------------------------------- /docs/images/nexys/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/18.png -------------------------------------------------------------------------------- /docs/images/nexys/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/19.png -------------------------------------------------------------------------------- /docs/images/nexys/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/2.png -------------------------------------------------------------------------------- /docs/images/nexys/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/20.png -------------------------------------------------------------------------------- /docs/images/nexys/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/21.png -------------------------------------------------------------------------------- /docs/images/nexys/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/22.png -------------------------------------------------------------------------------- /docs/images/nexys/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/23.png -------------------------------------------------------------------------------- /docs/images/nexys/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/24.png -------------------------------------------------------------------------------- /docs/images/nexys/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/25.png -------------------------------------------------------------------------------- /docs/images/nexys/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/26.png -------------------------------------------------------------------------------- /docs/images/nexys/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/27.png -------------------------------------------------------------------------------- /docs/images/nexys/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/28.png -------------------------------------------------------------------------------- /docs/images/nexys/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/29.png -------------------------------------------------------------------------------- /docs/images/nexys/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/3.png -------------------------------------------------------------------------------- /docs/images/nexys/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/30.png -------------------------------------------------------------------------------- /docs/images/nexys/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/31.png -------------------------------------------------------------------------------- /docs/images/nexys/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/32.png -------------------------------------------------------------------------------- /docs/images/nexys/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/33.png -------------------------------------------------------------------------------- /docs/images/nexys/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/34.png -------------------------------------------------------------------------------- /docs/images/nexys/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/35.png -------------------------------------------------------------------------------- /docs/images/nexys/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/36.png -------------------------------------------------------------------------------- /docs/images/nexys/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/37.png -------------------------------------------------------------------------------- /docs/images/nexys/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/38.png -------------------------------------------------------------------------------- /docs/images/nexys/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/39.png -------------------------------------------------------------------------------- /docs/images/nexys/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/4.png -------------------------------------------------------------------------------- /docs/images/nexys/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/40.png -------------------------------------------------------------------------------- /docs/images/nexys/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/41.png -------------------------------------------------------------------------------- /docs/images/nexys/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/42.png -------------------------------------------------------------------------------- /docs/images/nexys/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/43.png -------------------------------------------------------------------------------- /docs/images/nexys/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/44.png -------------------------------------------------------------------------------- /docs/images/nexys/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/45.png -------------------------------------------------------------------------------- /docs/images/nexys/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/46.png -------------------------------------------------------------------------------- /docs/images/nexys/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/5.png -------------------------------------------------------------------------------- /docs/images/nexys/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/6.png -------------------------------------------------------------------------------- /docs/images/nexys/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/7.png -------------------------------------------------------------------------------- /docs/images/nexys/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/8.png -------------------------------------------------------------------------------- /docs/images/nexys/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/nexys/9.png -------------------------------------------------------------------------------- /docs/images/simple_logic/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/1.png -------------------------------------------------------------------------------- /docs/images/simple_logic/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/10.jpg -------------------------------------------------------------------------------- /docs/images/simple_logic/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/11.png -------------------------------------------------------------------------------- /docs/images/simple_logic/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/12.png -------------------------------------------------------------------------------- /docs/images/simple_logic/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/13.png -------------------------------------------------------------------------------- /docs/images/simple_logic/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/2.png -------------------------------------------------------------------------------- /docs/images/simple_logic/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/3.png -------------------------------------------------------------------------------- /docs/images/simple_logic/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/4.png -------------------------------------------------------------------------------- /docs/images/simple_logic/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/5.png -------------------------------------------------------------------------------- /docs/images/simple_logic/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/6.png -------------------------------------------------------------------------------- /docs/images/simple_logic/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/7.png -------------------------------------------------------------------------------- /docs/images/simple_logic/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/8.jpg -------------------------------------------------------------------------------- /docs/images/simple_logic/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_logic/9.jpg -------------------------------------------------------------------------------- /docs/images/simple_timing/1563343618646.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563343618646.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563343625669.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563343625669.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563348458064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563348458064.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563348467432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563348467432.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563348507286.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563348507286.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563351467888.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563351467888.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563351546606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563351546606.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563351645754.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563351645754.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563351653862.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563351653862.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563381597066.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563381597066.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563382256831.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563382256831.png -------------------------------------------------------------------------------- /docs/images/simple_timing/1563422019450.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/1563422019450.png -------------------------------------------------------------------------------- /docs/images/simple_timing/271607238061109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/271607238061109.jpg -------------------------------------------------------------------------------- /docs/images/simple_timing/271611489786197.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/simple_timing/271611489786197.jpg -------------------------------------------------------------------------------- /docs/images/testbench/1564495138182.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/testbench/1564495138182.png -------------------------------------------------------------------------------- /docs/images/testbench/1564497081267.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/testbench/1564497081267.png -------------------------------------------------------------------------------- /docs/images/testbench/1564497101657.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/testbench/1564497101657.png -------------------------------------------------------------------------------- /docs/images/verilog/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/1.png -------------------------------------------------------------------------------- /docs/images/verilog/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/10.png -------------------------------------------------------------------------------- /docs/images/verilog/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/11.png -------------------------------------------------------------------------------- /docs/images/verilog/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/12.png -------------------------------------------------------------------------------- /docs/images/verilog/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/13.png -------------------------------------------------------------------------------- /docs/images/verilog/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/14.png -------------------------------------------------------------------------------- /docs/images/verilog/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/15.png -------------------------------------------------------------------------------- /docs/images/verilog/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/16.png -------------------------------------------------------------------------------- /docs/images/verilog/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/17.png -------------------------------------------------------------------------------- /docs/images/verilog/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/18.png -------------------------------------------------------------------------------- /docs/images/verilog/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/19.png -------------------------------------------------------------------------------- /docs/images/verilog/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/2.png -------------------------------------------------------------------------------- /docs/images/verilog/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/20.png -------------------------------------------------------------------------------- /docs/images/verilog/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/21.png -------------------------------------------------------------------------------- /docs/images/verilog/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/22.png -------------------------------------------------------------------------------- /docs/images/verilog/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/23.png -------------------------------------------------------------------------------- /docs/images/verilog/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/24.png -------------------------------------------------------------------------------- /docs/images/verilog/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/25.png -------------------------------------------------------------------------------- /docs/images/verilog/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/26.png -------------------------------------------------------------------------------- /docs/images/verilog/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/27.png -------------------------------------------------------------------------------- /docs/images/verilog/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/28.png -------------------------------------------------------------------------------- /docs/images/verilog/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/29.png -------------------------------------------------------------------------------- /docs/images/verilog/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/3.png -------------------------------------------------------------------------------- /docs/images/verilog/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/30.png -------------------------------------------------------------------------------- /docs/images/verilog/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/31.png -------------------------------------------------------------------------------- /docs/images/verilog/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/32.png -------------------------------------------------------------------------------- /docs/images/verilog/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/33.png -------------------------------------------------------------------------------- /docs/images/verilog/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/34.png -------------------------------------------------------------------------------- /docs/images/verilog/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/35.png -------------------------------------------------------------------------------- /docs/images/verilog/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/36.png -------------------------------------------------------------------------------- /docs/images/verilog/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/37.png -------------------------------------------------------------------------------- /docs/images/verilog/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/38.png -------------------------------------------------------------------------------- /docs/images/verilog/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/39.png -------------------------------------------------------------------------------- /docs/images/verilog/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/4.png -------------------------------------------------------------------------------- /docs/images/verilog/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/40.png -------------------------------------------------------------------------------- /docs/images/verilog/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/41.png -------------------------------------------------------------------------------- /docs/images/verilog/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/5.png -------------------------------------------------------------------------------- /docs/images/verilog/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/6.png -------------------------------------------------------------------------------- /docs/images/verilog/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/7.png -------------------------------------------------------------------------------- /docs/images/verilog/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/8.png -------------------------------------------------------------------------------- /docs/images/verilog/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/verilog/9.png -------------------------------------------------------------------------------- /docs/images/vivado/1563975870237.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563975870237.png -------------------------------------------------------------------------------- /docs/images/vivado/1563976105757.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563976105757.png -------------------------------------------------------------------------------- /docs/images/vivado/1563976287338.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563976287338.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977072544.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977072544.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977087617.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977087617.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977117169.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977117169.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977129985.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977129985.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977283279.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977283279.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977387856.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977387856.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977423656.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977423656.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977433777.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977433777.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977458759.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977458759.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977580563.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977580563.png -------------------------------------------------------------------------------- /docs/images/vivado/1563977690375.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USTC-vlab/guide/7d4b73bf98ec012b46be6d8c452e11f763129912/docs/images/vivado/1563977690375.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # 欢迎来到实验课程主页 2 | 3 | 在这里,从门电路开始,一步一步设计出有限状态机 4 | -------------------------------------------------------------------------------- /docs/katex.js: -------------------------------------------------------------------------------- 1 | document$.subscribe(({ body }) => { 2 | renderMathInElement(body, { 3 | delimiters: [ 4 | { left: "$$", right: "$$", display: true }, 5 | { left: "$", right: "$", display: false }, 6 | { left: "\\(", right: "\\)", display: false }, 7 | { left: "\\[", right: "\\]", display: true } 8 | ], 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: 数字电路教程 2 | site_author: USTC Vlab 3 | site_url: https://vlab.ustc.edu.cn/guide/ 4 | repo_name: USTC-vlab/guide 5 | repo_url: https://github.com/USTC-vlab/guide 6 | use_directory_urls: false 7 | 8 | theme: 9 | name: material 10 | language: zh 11 | palette: 12 | - scheme: default 13 | media: "(prefers-color-scheme: light)" 14 | primary: blue 15 | accent: blue 16 | toggle: 17 | icon: material/toggle-switch-off-outline 18 | name: 切换至深色模式 19 | - scheme: slate 20 | media: "(prefers-color-scheme: dark)" 21 | primary: light blue 22 | accent: light blue 23 | toggle: 24 | icon: material/toggle-switch 25 | name: 切换至浅色模式 26 | icon: 27 | logo: material/book 28 | repo: octicons/mark-github-16 29 | features: 30 | - navigation.sections 31 | - navigation.top 32 | 33 | markdown_extensions: 34 | - attr_list 35 | - def_list 36 | - pymdownx.arithmatex: 37 | generic: true 38 | - pymdownx.highlight 39 | - pymdownx.superfences 40 | - pymdownx.tilde 41 | 42 | extra_javascript: 43 | - katex.js 44 | - https://unpkg.com/katex@0/dist/katex.min.js 45 | - https://unpkg.com/katex@0/dist/contrib/auto-render.min.js 46 | 47 | extra_css: 48 | - https://unpkg.com/katex@0/dist/katex.min.css 49 | 50 | extra: 51 | social: 52 | - icon: octicons/globe-16 53 | link: 'https://vlab.ustc.edu.cn/' 54 | - icon: octicons/mark-github-16 55 | link: 'https://github.com/USTC-vlab' 56 | analytics: 57 | provider: google 58 | property: UA-115907213-3 59 | 60 | nav: 61 | - 课程介绍: index.md 62 | - LogiSim: doc_logisim.md 63 | - Verilog 语法: doc_verilog.md 64 | - FPGA 原理: doc_fpga.md 65 | - Nexys4DDR 开发板: doc_nexys.md 66 | - Vivado 介绍: doc_vivado.md 67 | - TestBench 编写及仿真: doc_testbench.md 68 | - 代码风格规范: coding_convention.md 69 | - 一些例子: 70 | - 基本逻辑门: doc_basic_logic.md 71 | - 简单组合逻辑电路: doc_simple_logic.md 72 | - 复杂组合逻辑电路: doc_complex_logic.md 73 | - 简单时序逻辑电路: doc_simple_timing.md 74 | - 复杂时序逻辑电路: doc_complex_timing.md 75 | - 有限状态机: doc_finite_state_machine.md 76 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs-material~=9.5 2 | --------------------------------------------------------------------------------