0-1 开始
第一步
欢迎来到HDLBits!
对于数字逻辑的入门,一开始可能比较困难。因为你需要学习新的概念,一种新的语言(硬件描述语言,Hardware Description Language)例如Verilog,一些新的软件包,通常还需要FPGA开发板。这些新内容的学习几乎是同时进行的。而HDLBits只需要简单点击一下“仿真”(Simulate)按钮,就可以设计、调试简单电路。
设计一个电路需要以下步骤:撰写HDL代码(例如Verilog代码)、编译该代码从而生成一个电路、仿真电路并修正错误。
写代码
最简单的写代码的方式就是在下面的编辑框内编写你的代码。对于每一个问题,我们已经写好了该问题部分必要的代码以简化你的工作。你只需要完成该电路的剩余代码即可。
编写完代码后,点击提交(Submit)开始编译和调试你的设计。
编译(逻辑分析)
你所写的代码被Altera Quartus编译并生成电路。这个过程Quartus会生成巨量的信息。点击“展示Quartus信息”(Show Quartus messages)来展开/隐藏这些信息。对于警告信息(warnings)需要辩证地看待。消除大量的警告固然很好,但是警告毕竟不是报错,消除全部的警告在有些情况下并不现实。
仿真
对编译好的电路需要仿真,以测试电路功能是否正常。进行仿真时,HDLBits会使用ModelSim同时仿真你编译生成的电路和网站自带的参考电路,然后对比两者的输出。仿真报告会反映两种信息:
- 不匹配信息
仿真报告会报告你的电路是否和参考电路完全匹配(零错误)。如果不是完全匹配,仿真报告会详细反映不匹配的情况。不匹配是指你的电路输出的样例和对应(对应是指相同输入)参考电路输出的样例不相同。
- 时序图
仿真报告会生成时序图(timing diagrams)。时序图是指在运行测试矢量时的电路输出。仿真的波形分为三个部分:输入、你的电路输出、参考电路输出。如果你的电路是正确的,那么你的电路输出和参考电路输出是相同的。如果不完全相同,仿真报告会在Mismatch中反映出哪些样例是不相同的。
顶级(top-level)top_module的模块名和端口名不能更改,否则会产生仿真错误。
最终状态
如果你的电路是正确的,你可以看到“状态:成功!”(Status: Success!)的字样。不正确的情况有以下几种:
- Compile Error(编译错误) — 电路没有被编译出来→说明你的代码有语法错误或者无法生成合理的电路
- Simulation Error(仿真错误) — 电路被编译出来了,但是仿真没有完成
- Incorrect(不正确) — 电路和仿真都完成了,但是你的电路输出和参考电路的输出不匹配
你可以在我的统计页面跟踪或者分享你的进度。
以上就是对HDLBits的简单介绍,下面进行一个简单的示例。
问题说明
我们将从少量 HDL 开始,以熟悉 HDLBits 使用的接口。下面是本练习所需的电路描述:
构建一个没有输入、只有一个输出的电路。该输出应始终驱动 1(或逻辑高电平)。
预计解决方案长度:约 1 行。
模块声明
1 module top_module( output one );
提示:我们想要将1赋值给输出端
1 | //正确代码示例 |
0-2 输出零
建立一个没有输入、只有一个输出的电路,输出常数 0
既然你已经完成了前面的问题,那么让我们来看看你能否在没有提示的情况下完成一个简单的问题。
HDLBits 使用 Verilog-2001 ANSI 样式的端口声明语法,因为这种语法更易于阅读并能减少错别字。如果您愿意,也可以使用较早的 Verilog-1995 语法。例如,以下两个模块声明是可接受的等价声明:
1 | module top_module ( zero ); |
1 | module top_module ( output zero ); |
模块声明
1 module top_module( output one );
提示:有趣的事实,Quartus 综合时,不给信号赋值通常会导致信号为 0。
1 | module top_module( |