一、实验目的
1.学习FPGA的设计方法;
2.掌握利用Verilog HDL设计逻辑电路的能力。
二、实验所用组件
Basys2开发板(芯片为XC3S100E,封装为CP132)1套。
三、实验内容
下面是4位二进制数加法器的数据流描述,由于被加数A和加数B 都是4位的,而低位来的进位Cin为1位,所以运算的结果可能为5位,用{Cout,Sum}拼接起来表示。
module adder(
input [3:0] A,
input [3:0] B,
input Cin,
output [3:0] SUM,
output Cout
);
assign {Cout,SUM}=A+B+Cin;
Endmodule
四、实验步骤与要求
1.创建一个子目录Lab2,并新建一个工程项目
2.建立一个Verilog HDL文件,将该文件添加到工程项目中并编译整个项目,查看该电路所占用的逻辑单元(Logic Elements,LE)的数量
3.对设计项目进行时序仿真,记录仿真波形图
测试代码如下:
module add4_tb;
// Inputs
reg [3:0] A;
reg [3:0] B;
reg Cin;
// Outputs
wire [3:0] Sum;
wire Cout;
// Instantiate the Unit Under Test (UUT)
add4 uut (
.A(A),
.B(B),
.Cin(Cin),
.Sum(Sum),
.Cout(Cout)
);
initial begin
// Initialize Inputs
A<=4'd0;B<=4'd0;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd0;B<=4'd1;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd0;B<=4'd2;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd0;B<=4'd3;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd0;B<=4'd4;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd1;B<=4'd0;Cin=1'b1;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd2;B<=4'd0;Cin=1'b0;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
A<=4'd4;B<=4'd0;Cin=1'b1;
#1 $display("A B Cin Sum Cout=%b %b %b %b %b",A,B,Cin,Sum,Cout);
end
endmodule
4.根据FPGA开发板使用说明书,对设计文件中的输入、输出信号分配引脚。
即使用开发板上的波动开关代表电路的输入,用发光二极管(LED)代表电路的输出。
引脚分布代码:
NET"A[0]" LOC="G3";
NET"A[1]" LOC="F3";
NET"A[2]" LOC="E2";
NET"A[3]" LOC="N3";
NET"B[0]" LOC="P11";
NET"B[1]" LOC="L3";
NET"B[2]" LOC="K3";
NET"B[3]" LOC="B4";
NET"Sum[0]" LOC="N5";
NET"Sum[1]" LOC="N4";
NET"Sum[2]" LOC="P4";
NET"Sum[3]" LOC="G1";
NET"Cin" LOC="A7";
NET"Cout" LOC="P6";
5.重新编译电路,并下载到FPGA器件中。
改变拨动开关的位置,并观察LED的亮、灭状态,测试电路功能
6.根据实验流程和实验结果,写出实验总结报告,并对波形图和实验现象进行说明。
7.完成实验后,关闭所有程序,并关闭计算机。
实验现象:
由波形图可见,输出由Cout,Sum组成,是A、B、低位进位Cin 的和,Cout是为和的进位。
用数据流模式描述,实现了二进制数四位加法器。
分析和心得:
通过这次实验我熟悉了Verilog HDL 元件例化语句的作用,并且熟悉全加器的工作原理。
在四位全加器的过程中,我也了解了如何调用模块,分配引脚。
了解了用代码设计电路的流程。