目录
一、Verilog编程入门练习
1.1、门电路
(1)与门
module top_module(
input a,
input b,
output out );
assign out = a&b;
endmodule
(2)或非门
或非门是具有多端输入和单端输出的门电路。当任一输入端(或多端)为高电平(逻辑“1”)时,输出就是低电平(逻辑“0”);只有当所有输入端都是低电平(逻辑“0”)时,输出才是高电平(逻辑“1”)。输入的或非门真值表如下表所示:
module top_module(
input a,
input b,
output out );
assign out = ~(a|b);
endmodule
(3)同或门
同或门(英语:XNOR gate或equivalence gate)也称为异或非门,在异或门的输出端再加上一个非门就构成了异或非门,是数字逻辑电路的基本单元,有2个输入端、1个输出端。当2个输入端中有且只有一个是低电平(逻辑0)时,输出为低电平。亦即当输入电平相同时,输出为高电平(逻辑1)。
module top_module(
input a,
input b,
output out );
assign out = ~(a^b);
endmodule
1.2、组合电路
(1)Declaring wires
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire and_ab;
wire and_cd;
assign and_ab = a&b;
assign and_cd = c&d;
assign out = and_ab|and_cd;
assign out_n = ~out;
endmodule
(2)7458
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire p11, p12, p21, p22;
assign p11 = (p1a&p1b&p1c);
assign p12 = (p1d&p1e&p1f);
assign p21 = (p2a&p2b);
assign p22 = (p2c&p2d);
assign p1y = p11 | p12;
assign p2y = p21 | p22;
endmodule
(3)7420
module top_module (
input p1a, p1b, p1c, p1d,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
assign p1y = ~(p1a&p1b&p1c&p1d);
assign p2y = ~(p2a&p2b&p2c&p2d);
endmodule
1.3、时序电路
(1)D触发器
module top_module (
input clk, // Clocks are used in sequential circuits
input d,
output reg q );//
// Use a clocked always block
// copy d to q at every positive edge of clk
// Clocked always blocks should use non-blocking assignments
always@(posedge clk) begin
q <= d;
end
endmodule
(2)Dff8
module top_module (
input clk,
input [7:0] d,
output [7:0] q
);
always@(posedge clk) begin
q <= d;
end
endmodule
(3)DFF8r
module top_module (
input clk,
input reset, // Synchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk) begin
q <= (~{8{reset}} & d);
end
endmodule
二、Logisim仿真
首先安装Logisim软件,新建一个项目,采用门电路组合电路方式完成一个1位全加器的设计,并在Logisim中进行测试。然后封装这个1位全加器为自定义的一个子电路模块(比如名称为OneAdder),然后新建一个项目,用1位全加器串行级联方式完成一个4位全加器的设计,并进行功能测试。
2.1、1bit全加器
1bit全加器真值表如下:
a | b | cin | sum |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
逻辑表达式如下:
sum = a ⊕ b ⊕ cin;
cout = ab +(a⊕b)cin ;
绘制电路图如下:
测试如下(使用工具栏中的修改值工具):
2.2、4bit全加器
封装1bit全加器,使用串联方法进行4bit全加器的构建:
验证如下:
也可查看其真值表:
四、Quartus实验仿真
首先基于Quartus 软件完成一个1位全加器的设计。分别采用原理图输入以及 Verilog编程 这两种设计方法。然后通过4个1位全加器的串行级联,完成一个4位全加器的 原理图设计;再改用 Verilog编程(3种模式:门电路、数据流和行为级描述),完成这个4位全加器设计,并观察Verilog代码编译综合后生成的 RTL电路,与之前电路图设计的4位全加器电路进行对比 。
4.1、原理图输入1bit全加器
4.1.1、创建工程
点击new project wizard,选择创建路径以及工程名
后续直接next到finish
4.1.2、电路图
file->new
编译
查看RTL
创建vwm格式波形文件,仿真
4.2、Verilog语言实现1bit全加器
4.2.1、创建verilog文件
4.2.2、代码
module FullAdder_gate(
input a, b, cin,
output sum, cout
);
assign sum = a ^ b ^ cin;
assign cout = (a & b) | ((a^b)&cin);
endmodule
4.2.3、RTL
logisim电路图:
发现两者是一样的。
4.3、原理图设计4bit全加器
4.3.1、电路图
4.3.2、RTL
4.4、Verilog编写4bit全加器(数据流)
4.4.1、代码
module FullAdder_four_gate (
input [3:0] a, b,
output [3:0] sum,
input cin,
output cout
);
wire c1, c2, c3;
FullAdder_one_gate f1(a[0], b[0], cin, sum[0], c1);
FullAdder_one_gate f2(a[1], b[1], c1, sum[1], c2);
FullAdder_one_gate f3(a[2], b[2], c2, sum[2], c3);
FullAdder_one_gate f4(a[3], b[3], c3, sum[3], cout);
endmodule
module FullAdder_one_gate (
input a, b, cin,
output sum, cout
);
assign sum = a^b^cin;
assign cout = (a&b)|((a^b)&cin);
endmodule
4.4.2、RTL
4.5、Verilog编写4bit全加器(行为级描述)
4.5.1、代码
module FullAdder_one_functional (
input a,b,cin,
output sum,cout
);
assign {cout, sum} = a + b + cin;
endmodule
module FullAdder_four_functional (
input [3:0] a, b,
output [3:0] sum,
input cin,
output cout);
wire c0, c1, c2;
FullAdder_one_functional f1(a[0], b[0], cin, sum[0], c0);
FullAdder_one_functional f2(a[1], b[1], c0, sum[1], c1);
FullAdder_one_functional f3(a[2], b[2], c1, sum[2], c2);
FullAdder_one_functional f4(a[3], b[3], c2, sum[3], cout);
endmodule
4.5.2、RTL
logisim生成的:
对比可发现,使用verilog可以将输入个数变为位宽处理,其它部分区别并不是很大。
五、VHDL语言风格描述
5.1、行为描述
使用过程块语句结构(always)和比较抽象的高级程序语句对电路的逻辑功能进行描述。
5.2、数据流描述
使用连续赋值语句(assign)对电路的逻辑功能进行描述,该方式特别便于对组合逻辑电路建模。
5.3、门级描述
使用实例化低层次模块的方法,即调用其他已经定义过的低层次模块对整个电路的功能进行描述,或者直接调用Verilog内部预先定义的基本门级元件描述电路的结构。
六、仿真波形烧录验证
在实验室只做出了一位全加器,忘记拍视频,借用同学的视频展示效果。
六、实验总结
经过本次实验初步了解了Verilog编程的思想,熟悉了quartus的基本操作,发现之前学过的模数电知识已经全忘了,还有计算机系统等,需要重新再回顾一下知识。
参考资料
https://blog.csdn.net/qq_43279579/article/details/115286467
https://blog.csdn.net/qq_43279579/article/details/115480406
https://blog.csdn.net/m0_74045503/article/details/134960936
等