赞
踩
在上一次的学习内容《Vivado建立工程》的基础上,我已经有一个工程了,现在以1位全加器的设计过程来举例说明Verilog HDL程序的设计以及在Vivado上进行程序设计的过程。包括:
根据真值表进行简化,1位二进制全加器可以由两个半加器和一个或门组成,因此使用自底向上的设计方法,先分别进行底层的或门模块my_or2.v和半加器模块h_adder.v的设计,再进行顶层的1位全加器h_adder.v的设计。
创建并添加3个源文件
在Design Sources里右键f_adder.v,选择Set as Top,将f_adder.v设为Top文件。
// 或门模块
module my_or2(a, b, c); // 模块描述开始
input a, b; // 模块输入端口说明
output c; // 模块输出端口说明
// 数据流方式描述模块功能
assign c = a | b; // 连续赋值语句描述模块功能
endmodule // 模块描述结束
// 半加器模块
module h_adder(a, b, so, co); // 模块描述开始
input a, b; // 模块输入端口说明
output so, co; // 模块输出端口说明
// 数据流方式描述模块功能
assign so = (a | b) && (!(a && b)); // 连续赋值语句描述模块功能
assign co = !(!(a && b)); // 连续赋值语句描述模块功能
endmodule // 模块描述结束
// 全加器模块
module f_adder(ain, bin, cin, sum, cout); // 模块描述开始
input ain, bin, cin; // 模块输入端口说明
output sum, cout; // 模块输出端口说明
wire s1, s2, s3; // 数据类型说明
// 使用元件实例化语句描述系统的组成结构
h_adder u1(.a(ain),.b(bin),.so(s2),.co(s1)); // 名字关联元件实例化
h_adder u2(.a(s2),.b(cin),.so(sum),.co(s3)); // 名字关联元件实例化
my_or2 u3(.a(s1),.b(s3),.c(cout)); // 名字关联元件实例化
endmodule // 模块描述结束
在左边流程窗口点击Add Sources,再选择Add or create simulation sources
在Simulation Sources里面添加一个tb_top.v文件,并编写testbench的内容。
`timescale 1ns / 1ps module tb_top(); reg ain, bin, cin; wire sum, cout; initial begin ain = 0; bin = 0; cin = 0; end always #10 ain = !ain; always #20 bin = !bin; always #40 cin = !cin; f_adder uut (.ain(ain), .bin(bin), .cin(cin), .sum(sum), .cout(cout)); endmodule
在左边流程窗口中展开SIMULATION,点击Run Simulation,选择Run Behavioral Simulation运行。
弹出仿真结果窗口,全加器的sum和cout的逻辑符合预期。
在左边流程窗口中展开RTL ANALYSIS,选择Schmatic,点击运行。
打开RTL视图后,可以看出,Verilog等硬件描述语言描述的是一套硬件电路。如果电路系统正常工作的话,电路中各个部分应该是同时工作,也即电路系统的各部分工作是并行的。(经过一定的设计,也可以设计成按顺序工作的)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。