目录
一、数字逻辑电路基础知识复习
1.1与逻辑和与门电路
1.2或逻辑和或门电路
1.3非运算
1.4逻辑代数运算
1.4.1基本公式
1.4.2逻辑函数的常见表达式
1.5组合逻辑电路的例题
Verilog%E7%BC%96%E7%A8%8B%E5%A4%8D%E4%B9%A0-toc" name="tableOfContents" style="margin-left:0px">二、3-8译码器和4位全加器Verilog编程复习
Verilog%E7%9A%84%E7%94%B5%E8%B7%AF%E5%9B%BE%E5%AF%B9%E6%AF%94-toc" name="tableOfContents" style="margin-left:40px">2.1 3-8译码器Logsim 和Verilog的电路图对比
2.1.1logsim绘制的3-8译码器
Verilog%E7%BC%96%E7%A8%8B%E5%AE%9E%E7%8E%B0%E7%9A%84RTL%E7%94%B5%E8%B7%AF%E5%9B%BE-toc" name="tableOfContents" style="margin-left:80px">2.1.2Verilog编程实现的RTL电路图
2.1.3电路图区别对比
Verilog%E8%AE%BE%E8%AE%A1%E5%AE%9E%E7%8E%B04%E4%BD%8D%E5%85%A8%E5%8A%A0%E5%99%A8-toc" name="tableOfContents" style="margin-left:40px">2.2 Verilog设计实现4位全加器
三、4位全加器系统设计与演示
3.1.Quartus的4位全加器的设计
3.1.1 项目创建工作
3.1.2 半加器原理图绘制
3.1.3 全加器原理图绘制
3.1.4 4位全加器原理图绘制
Verilog%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%B8%8E%E4%BB%BF%E7%9C%9F-toc" name="tableOfContents" style="margin-left:80px">3.1.5 Verilog代码实现与仿真
3.2在DE2-115上完成下载和功能演示
四、3-8译码器设计与八段数码管演示
Verilog%E7%BC%96%E7%A8%8B%E4%B8%8E%E4%BB%BF%E7%9C%9F-toc" name="tableOfContents" style="margin-left:40px">4.1 Verilog编程与仿真
心得
一、数字逻辑电路基础知识复习
1.1与逻辑和与门电路
与逻辑关系:当决定某件事的条件全部具备时,这一事件才会发生。
其逻辑真值表表如下图:
与门电路:满足与逻辑真值表的电子电路
1.2或逻辑和或门电路
或逻辑:在决定某事件的条件中,有一个或多个条件成立,这一事件就会发生
其逻辑真值表表如下图:
或门电路:满足或逻辑真值表的电子电路
1.3非运算
非逻辑:事件发生的条件具备时,事件不会发生。
其逻辑真值表表如下图:
非门电路:满足非逻辑真值表的电子电路
1.4逻辑代数运算
1.4.1基本公式
1.4.2逻辑函数的常见表达式
1.5组合逻辑电路的例题
例. 电热水器内部容器示意图中,A、B、C为三个水位检测元件。当水面低于检测元件时,检测元件输出高电平;水面高于检测元件时,检测元件输出低电平。试用与非门设计一个热水器水位状态显示电路,要求当水面在A、B之间的正常状态时,绿灯G亮;水面在B、C间或A以上的异常状态时,黄灯Y亮;水面在C以下的危险状态时,红灯R亮。
解:
1.输入变量有(A,B,C)三个,为三个检测仪的输出
当水位低于检测仪时,设逻辑为1
当水位高于检测仪时,设逻辑为0
输出变量有(绿灯G,黄灯Y,红灯R)三个
灯亮时,设逻辑为1
灯灭时,设逻辑为0
2.根据题目可知:
水面在A,B间时,绿灯亮
水面在B,C间 或 A以上时,黄灯亮
水面在C以下时, 红等亮
由此我们可以写出对应的真值表:
A | B | C | G | Y | R |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 | 1 |
由此我们可以得到:
通过逻辑函数形式,我们可以对应绘制出逻辑图
Verilog%E7%BC%96%E7%A8%8B%E5%A4%8D%E4%B9%A0" name="%E4%BA%8C%E3%80%813-8%E8%AF%91%E7%A0%81%E5%99%A8%E5%92%8C4%E4%BD%8D%E5%85%A8%E5%8A%A0%E5%99%A8Verilog%E7%BC%96%E7%A8%8B%E5%A4%8D%E4%B9%A0">二、3-8译码器和4位全加器Verilog编程复习
Verilog%E7%9A%84%E7%94%B5%E8%B7%AF%E5%9B%BE%E5%AF%B9%E6%AF%94" name="2.1%203-8%E8%AF%91%E7%A0%81%E5%99%A8Logsim%20%E5%92%8CVerilog%E7%9A%84%E7%94%B5%E8%B7%AF%E5%9B%BE%E5%AF%B9%E6%AF%94">2.1 3-8译码器Logsim 和Verilog的电路图对比
下图为3-8译码器的逻辑真值表:
2.1.1logsim绘制的3-8译码器
Verilog%E7%BC%96%E7%A8%8B%E5%AE%9E%E7%8E%B0%E7%9A%84RTL%E7%94%B5%E8%B7%AF%E5%9B%BE" name="2.1.2Verilog%E7%BC%96%E7%A8%8B%E5%AE%9E%E7%8E%B0%E7%9A%84RTL%E7%94%B5%E8%B7%AF%E5%9B%BE">2.1.2Verilog编程实现的RTL电路图
注:具体Verilog编程代码和logsim绘制请看Verilog编程基础练习_verilog编程练习-CSDN博客
2.1.3电路图区别对比
通过Ai分析,我们将两张图进行对比,可以得到如下区别:
1.电路元件区别:
在logsim绘制中,我们主要使用与门、或门、非门等基本逻辑门。并将这些元件通过图形化界面直接连接和组合。
在Verilog编程实现的电路图中,还额外用到触发器元件(如D触发器)来存储状态,这些元件在Verilog代码中被综合成具体的硬件电路。
2.电路结构区别:
在logsim绘制中,整个电路结构相对简单,直接实现了译码器的功能。
在Verilog编程实现中,整体电路结构较为复杂,包含了多个层次的逻辑门和触发器,形成了一个相对完整的3-8译码器。
Verilog%E8%AE%BE%E8%AE%A1%E5%AE%9E%E7%8E%B04%E4%BD%8D%E5%85%A8%E5%8A%A0%E5%99%A8" name="2.2%20Verilog%E8%AE%BE%E8%AE%A1%E5%AE%9E%E7%8E%B04%E4%BD%8D%E5%85%A8%E5%8A%A0%E5%99%A8">2.2 Verilog设计实现4位全加器
代码实现:
module fuadder4(a,b,ci,co,s);input [3:0] a,b;input ci;output co;output [3:0] s;wire [2:0] count;add_1 U1(a[0],b[0],ci,count[0],s[0]);add_1 U2(a[1],b[1],count[0],count[1],s[1]);add_1 U3(a[2],b[2],count[1],count[2],s[2]);add_1 U4(a[3],b[3],count[2],co,s[3]); endmodule
对应生成的RTL电路:
三、4位全加器系统设计与演示
3.1.Quartus的4位全加器的设计
3.1.1 项目创建工作
(1)新建工程并选定元器件
然后一直Next到下面界面
然后一直Next到finish。
3.1.2 半加器原理图绘制
(1)半加器原理图绘制
我们将绘制的半加器编辑为元件符号存盘,便于我们后续全加器的绘制,先维持刚刚的绘制界面不变,然后选择CreateSymbolFilesforCurrentFile,将当前文件变为一个符号存盘。
通过编译过后,我们可以通过RTL Viewer查看对应的电路图
(2)仿真波形测试
先新建一个VWF波形文件
进行信号的添加
若仿真失败,我们进行仿真配置
注意在选择文件夹时要选择项目中对应的\simulation\qsim文件,以免后续错误。
仿真结果:
3.1.3 全加器原理图绘制
(1)全加器原理图绘制
先新建一个Block Diagram/Schematic File,然后选择元器件,通过输入刚刚绘制的半加器元件名称来添加元器件。
进行全加器原理图绘制
通过同样的步骤将绘制的全加器编辑为元件符号存盘,便于后续绘制
RTL电路图查看:
若查看的电路为half_adder的电路图,通过下面步骤对首要文件进行更改
选择想要查看的文件,单击右键,将该文件设为Top-level,然后重新进行编译。
(2)仿真波形测试
先新建一个full_adder的VWF波形文件,对应添加端口,然后绘制波形进行编译。
3.1.4 4位全加器原理图绘制
1.全加器原理图绘制
2.仿真波形测试
Verilog%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%B8%8E%E4%BB%BF%E7%9C%9F" name="3.1.5%20Verilog%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%B8%8E%E4%BB%BF%E7%9C%9F">3.1.5 Verilog代码实现与仿真
半加器代码实现:
module half_adder_verliog ( input a,b, output sum,cout ); assign{cout}=a&b; assign{sum}=a^b; endmodule
其对应RTL电路图:
全加器代码实现:
module full_adder_verliog(ain,bin,cin,cout,sum);input ain,bin,cin;output cout,sum;assign{cout,sum}=ain+bin+cin; endmodule
其对应的RTL图:
4位全加器代码实现:
module four_bit_adder_verliog(a,b,ci,co,s);input [3:0] a,b;input ci;output co;output [3:0] s;wire [2:0] count;full_adder_verliog U1(a[0],b[0],ci,count[0],s[0]);full_adder_verliog U2(a[1],b[1],count[0],count[1],s[1]);full_adder_verliog U3(a[2],b[2],count[1],count[2],s[2]);full_adder_verliog U4(a[3],b[3],count[2],co,s[3]); endmodule
其对应的RTL电路图:
3.2在DE2-115上完成下载和功能演示
四、3-8译码器设计与八段数码管演示
3-8译码器
3-8译码器有三个输入端(a,b,c)和八个输出端(cout[0]~cout[7]),输入端的三个二进制数可以表示从0到7的八个状态。对于每一个输入的组合,译码器只能激活一个输出线。
3-8译码器逻辑真值表
数码管
数码管按段可以分为七段数码管和八段数码管,区别就是八段数码管多了个小数点。常见的数码管有两种:共阴数码管和共阳数码管,共阴数码管就是高电平亮,低电平灭;共阳数码管就是低电平亮,高电平灭。
七段数码管
八段数码管
一个八段数码管由a,b,c,d,e,f,g,dp八个二极管组成,如上图所示,要使数码管显示不同的数字,只需点亮对应的LED即可。如:数码管显示“0”,则a,b,c,d,e,f六个LED亮,g,dp这两个LED灭,即可显示“0”。
将3-8译码器的输出连接到八段数码管的各个段上,具体来说,可以将译码器输出Y0到Y6分别连接到数码管的a到g段,Y7可以用来控制小数点dp。通过改变3-8译码器的输入,选择性的点亮数码管的某些段,从而显示出所需要的数字。
Verilog%E7%BC%96%E7%A8%8B%E4%B8%8E%E4%BB%BF%E7%9C%9F" name="4.1%20Verilog%E7%BC%96%E7%A8%8B%E4%B8%8E%E4%BB%BF%E7%9C%9F">4.1 Verilog编程与仿真
代码实现:
module DEC_3to8 (input [2:0] A, // 输入3位二进制信号output reg [7:0] Y // 输出8位独热码(低电平有效) ); always @(*) begincase (A)3'b000: Y = 8'b11111110; // Y0激活,显示03'b001: Y = 8'b11111101; // Y1激活,显示13'b010: Y = 8'b11111011; // Y2激活,显示23'b011: Y = 8'b11110111; // Y3激活,显示33'b100: Y = 8'b11101111; // Y4激活,显示43'b101: Y = 8'b11011111; // Y5激活,显示53'b110: Y = 8'b10111111; // Y6激活,显示63'b111: Y = 8'b01111111; // Y7激活,显示7default: Y = 8'b11111111; // 默认全灭endcase end endmodule
编译代码(下面图中的内容全部变为绿色即可)
生成RTL电路(点击Tool-->Netlist Viewers-->RTL Viewer )
数码管驱动模块(将译码器输出的独热码转换为供应及数码管段码)
module seg7_driver (input [7:0] Y, // 译码器输出(独热码)output reg [7:0] seg // 数码管段码(a-g+dp) ); always @(*) begincase (Y)8'b11111110: seg = 8'h3F; // 显示0(段码:0x3F)8'b11111101: seg = 8'h06; // 显示1(段码:0x06)8'b11111011: seg = 8'h5B; // 显示2(段码:0x5B)8'b11110111: seg = 8'h4F; // 显示3(段码:0x4F)8'b11101111: seg = 8'h66; // 显示4(段码:0x66)8'b11011111: seg = 8'h6D; // 显示5(段码:0x6D)8'b10111111: seg = 8'h7D; // 显示6(段码:0x7D)8'b01111111: seg = 8'h07; // 显示7(段码:0x07)default: seg = 8'h00; // 全灭endcase end endmodule
顶层模块(集成译码器与数码管驱动,连接译码器与数码管驱动模块,输入信号直接映射到数码管输出)
module top (input [2:0] A, // 拨码开关输入output [7:0] seg // 数码管段选信号 ); wire [7:0] Y; // 内部连接信号 decoder_3to8 u_decoder ( .A(A), .Y(Y) ); // 实例化译码器 seg7_driver u_seg7 ( .Y(Y), .seg(seg) ); // 实例化数码管驱动 endmodule
modesim仿真:
心得
通过本次学习,复习了数字逻辑电路的基础知识和Verilog编程的知识。进一步复习了通过Modesim进行波形仿真。