编程语言,光看书其实作用不大的,关键还需要自己进行实践。看书的时候,你觉得自己明白了、弄懂了,等到用modelsim实践的时候还是会出现这样那样的问题。因此,还是希望自己能够不断地训练和练习,这样可以达到熟能生巧的程度。就今天的加法器来说,其实内容还是比较简单的。主要就是数值和进位之间的关系。这些内容在计算机组成原理上面都会提到,关键是自己是否真正掌握。闲话不多说,可以编写一个verilog代码试试。
- module add(a, b, in, c, out);
- input a;
- input b;
- input in;
- output c;
- output out;
- assign {out, c} = a + b + in;
- endmodule
这里直接用数据流的形式解决。当然,大家可以根据自己的情况选择门电路编写也是可以的,毕竟条条大路通罗马嘛。不多说,继续编写testbench文件,
- `timescale 1ns/1ns
- module count_t;
- reg clk;
- reg a;
- reg b;
- reg in;
- wire c;
- wire out;
- add process(a, b, in, c, out);
- initial
- clk = 0;
- always
- forever #5 clk = ~clk;
- initial
- begin
- a = 0; b = 0; in = 0;
- #10 a = 0; b = 0; in = 1;
- #10 a = 0; b = 1; in = 0;
- #10 a = 0; b = 1; in = 1;
- #10 a = 1; b = 0; in = 0;
- #10 a = 1; b = 0; in = 1;
- #10 a = 1; b = 1; in = 0;
- #10 a = 1; b = 1; in = 1;
- end
- initial
- begin
- #200 $finish;
- end
- initial
- $monitor(" out = %d, c = %d\n", out, c);
- endmodule
我们知道,两个数字相加,此时如果还有进位信息的话,那么就会出现8种情况。如果大家不觉得烦的话,可以把这8种情况都测试一遍。当然如果不想看波形,直接用minitor打印出来也是可以的。
测试模块用于检测模块设计是否正确。它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期有偏差,则需要对模块进行修改
综合就是把xxx.v文件送到综合器处理,在选定实现器件和选取生成Verilog网表的前提下,启动综合器的编译。综合器会自动生成一系列文件,向操作者报告综合的结果。其中生成的Verilog Netlist文件(扩展名为xxx.vm),表示自动生成的门级逻辑结构网表,仍然用Verilog语句表示,但是比输入的源文件更加具体,可以用测试模块调用它做同样的仿真,运行结果更接近实际器件
布局布线就是把综合后生成的另一种文件(EDIF),在不显工具控制下进行处理,启动布线工具的编译。布局布线工具会自动生成一系列文件,向操作者报告布局布线的结果。其中生成的Verilog Netlist文件(扩展名为xxx.vo),表示自动生成的具体基本门级结构和连接的延迟,仍然用了Verilog基本不见结构语句和连接线的延迟参数的重新定义表示,库中的基本部件也进一步具体化,比综合后的扩展名为xxx.vm的文件更具体。可以用同一个测试模块调用它做同样的仿真,运行结果与实际器件运行结果几乎完全一致。
学习网址:http://blog.csdn.net/feixiaoxing/article/details/8927675