FPGA编程入门


实验环境

Quartus18.1
Intel DE2-115

一、认识半加器和全加器

1.半加器

半加器不考虑低位进位来的进位值,只有两个输入,两个输出。由一个与门和异或门构成.
真值表:
在这里插入图片描述

2.全加器

当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数。这种就是“全加器"
真值表:
在这里插入图片描述

二、输入原理图实现1位加法器

创建工程过程
启动 Quartus II 软件,选择File->New Project Wizard,在出现的界面下先Next,填写工程的路径和名称,然后接着Next,直到出现下面界面并进行相应操作。接着一路Next,直到Finish,完成工程的创建。

在这里插入图片描述

(一)半加器原理图输入

绘制过程实现
首先选择File->New,进入后选择Block Diagram/Schematic File
在这里插入图片描述

选择元件and2,xor,连接成以下电路图

在这里插入图片描述

保存文件,并编译
通过tool->Netlist Viewers->RTL Viewer,查看电路图
在这里插入图片描述

仿真实现
创建一个向量波形文件,选择菜单项 File→New->VWF
在这里插入图片描述

添加信号
在这里插入图片描述

编辑信号
在这里插入图片描述

功能仿真结果

在这里插入图片描述
通过仿真结果,可以发现得到的结果与真值表中是相吻合的。

(二)全加器原理图输入

利用半加器元件实现全加器

将设计项目设置为可调用的元件
在打开半加器原理图文件half_adder.bdf的情况下,选择菜中File中的Create/Update→CreateSymbolFilesforCurrentFile项,即可将当前文件h_adder.bdf变成一个元件符号存盘,以待在高层次设计中调用
在这里插入图片描述

绘制过程实现
首先选择File->New,进入后选择Block Diagram/Schematic File
在这里插入图片描述

选择元件half_adder,or2,添加输入输出,完成效果

在这里插入图片描述

保存文件,并编译
通过tool->Netlist Viewers->RTL Viewer,查看电路图
在这里插入图片描述

仿真实现
创建一个向量波形文件,选择菜单项 File→New->VWF
在这里插入图片描述

添加信号
在这里插入图片描述

编辑信号
在这里插入图片描述

功能仿真结果
在这里插入图片描述
通过仿真结果,可以发现得到的结果与真值表中是相吻合的。

三、Verilog实现1位加法器

  1. 创建Verilog文件
    在这里插入图片描述

  2. 代码实现

module full_adder(
	//输入信号,ain表示被加数,bin表示加数,cin表示低位向高位的进位
	input ain,bin,cin,
	//输出信号,cout表示向高位的进位,sum表示本位的相加和
	output reg cout,sum

);
reg s1,s2,s3;
always @(ain or bin or cin) begin
	sum=(ain^bin)^cin;//本位和输出表达式
	s1=ain&cin;
	s2=bin&cin;
	s3=ain&bin;
	cout=(s1|s2)|s3;//高位进位输出表达式
end
endmodule

保存并编译文件
通过tool->Netlist Viewers->RTL Viewer,查看电路图
在这里插入图片描述

仿真如上

四、下载测试

芯片引脚配置表
在这里插入图片描述
在这里插入图片描述

(一)输入原理图

  1. 配置引脚
    使用3个SW作为输入信号,2个LED作为输出信号
    在这里插入图片描述
    原理图如下
    在这里插入图片描述

  2. 下载
    在这里插入图片描述

  3. 运行结果
    在这里插入图片描述

扩展:4位全加器

在这里插入图片描述

将1位全加器的q与q1首尾相连,开头的输入进位接地,最后一个全加器的输出的进位表示是否溢出。按照上图连接,将实现4位全加器,并判断是否溢出。
在这里插入图片描述
使用VerilogHDL语言实现4位全加器的话,原理与上面一样。

代码如下:

 module exp1_fulladder_4bits(
    input [3:0]  d1,
    input [3:0]  d0,
    output   [3:0] out,
    output   q
 );
	 wire q1;
	 assign q1 = 1'b0;
	 
    wire [2:0] _q;
    exp1_fulladder u_exp1_fulladder(
        .d1     (d1[0]),
        .d0     (d0[0]),
        .q1     (q1),
        .out    (out[0]),
        .q      (_q[0])
    );

    exp1_fulladder u_exp1_fulladder_2(
        .d1     (d1[1]),
        .d0     (d0[1]),
        .q1     (_q[0]),
        .out    (out[1]),
        .q      (_q[1])
    );
    
    exp1_fulladder u_exp1_fulladder_3(
        .d1     (d1[2]),
        .d0     (d0[2]),
        .q1     (_q[1]),
        .out    (out[2]),
        .q      (_q[2])
    );

    exp1_fulladder u_exp1_fulladder_4(
        .d1     (d1[3]),
        .d0     (d0[3]),
        .q1     (_q[2]),
        .out    (out[3]),
        .q      (q)
    );
 endmodule

在这里插入图片描述

实验总结

本次实验使用FPGA制作了全加器,并从1位全加器扩展到了4位。复习了前面学习的数电知识,以及更进一步地练习了verilog语法与fpga的使用。

另外发现,蓝色LED与白色LED的工作功率似乎比红,绿,黄三色的LED大。在接上限流电阻的时候白灯与蓝灯会不亮。

猜你喜欢

转载自blog.csdn.net/qq_52187415/article/details/129730426