====== 实验1.2 多输入基本门电路 ======
===== 1.实验目的 =====
* 熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法
* 通过实验理解基本门电路
* 掌握用Verilog HDL数据流基本门电路的方法
===== 2.实验任务 =====
利用Verilog语言实现不同的多输入基本逻辑门。
===== 3.实验原理 =====
4输入与门,或门,与非门,或非门,异或门,同或门真值如下表所示:
{{::4输入门电路真值表.png|}}
===== 4.Verilog HDL建模描述 =====
==== 程序清单four_in_gates.v ====
//********************************************************
//
// Copyright(c)2016, STEP FPGA
// All rights reserved
//
// File name : four_in_gates.v
// Module name : four_in_gates
// Author : STEP
// Email : info@stepfpga.com
// Data : 2016/08/19
// Version : V1.0
// Description : 4 inputs and 6 logic four_in_gates
//
// Modification history
// ----------------------------------------------------------------------------
// Version Data(2016/08/19) V1.0
// Description
//
//********************************************************
//
//
//*******************
//DEFINE MODULE PORT
//*******************
module four_in_gates
(
//INPUT
a ,
//OUTPUT
led ,
empty
);
//*******************
//DEFINE INPUT
//*******************
input [3:0] a;
//*******************
//DEFINE OUTPUT
//*******************
output [7:0] empty;
output [5:0] led;
wire [5:0] z;
//Combinational logic style
// assign z[5]=a[0]&a[1]&a[2]&a[3]; //three kinds of AND logic expression
// assign z[5]=&a;
and(z[5],a[0],a[1],a[2],a[3]);
// assign z[4]=~(a[0]&a[1]&a[2]&a[3]); //three kinds of NAND logic expression
// assign z[4]=~&a;
nand(z[4],a[0],a[1],a[2],a[3]);
// assign z[3]=a[0]|a[1]|a[2]|a[3]; //three kinds of OR logic expression
// assign z[3]=|a;
or(z[3],a[0],a[1],a[2],a[3]);
// assign z[2]=~(a[0]|a[1]|a[2]|a[3]); //three kinds of NOR logic expression
// assign z[2]=~|a;
nor(z[2],a[0],a[1],a[2],a[3]);
// assign z[1]=a[0]^a[1]^a[2]^a[3]; //three kinds of XOR logic expression
// assign z[1]=^a;
xor(z[1],a[0],a[1],a[2],a[3]);
// assign z[0]=a[0]~^a[1]~^a[2]~^a[3]; //three kinds of XNOR logic expression
// assign z[0]=~^a;
xnor(z[0],a[0],a[1],a[2],a[3]);
assign led=~z; //led is low active
assign empty=8'b1111_1111; //led's defualt mode is lighted
endmodule
==== 仿真程序清单gates_tb.v ====
//
//*******************
//DEFINE MODULE PORT
//*******************
`timescale 1ns/100ps
module four_in_gates_tb;
reg [3:0] a;
initial
begin
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
#50;
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=1;
#50;
a[0]=0;
a[1]=0;
a[2]=1;
a[3]=0;
#50;
a[0]=0;
a[1]=0;
a[2]=1;
a[3]=1;
#50;
a[0]=0;
a[1]=1;
a[2]=0;
a[3]=0;
#50;
a[0]=0;
a[1]=1;
a[2]=0;
a[3]=1;
#50;
a[0]=0;
a[1]=1;
a[2]=1;
a[3]=0;
#50;
a[0]=0;
a[1]=1;
a[2]=1;
a[3]=1;
#50;
a[0]=1;
a[1]=0;
a[2]=0;
a[3]=0;
#50;
a[0]=1;
a[1]=0;
a[2]=0;
a[3]=1;
#50;
a[0]=1;
a[1]=0;
a[2]=1;
a[3]=0;
#50;
a[0]=1;
a[1]=0;
a[2]=1;
a[3]=1;
#50;
a[0]=1;
a[1]=1;
a[2]=0;
a[3]=0;
#50;
a[0]=1;
a[1]=1;
a[2]=0;
a[3]=1;
#50;
a[0]=1;
a[1]=1;
a[2]=1;
a[3]=0;
#50;
a[0]=1;
a[1]=1;
a[2]=1;
a[3]=1;
#50;
end
four_in_gates four_in_gates_tb_uut(
.a(a)
);
endmodule
===== 五、 实验步骤=====
\\
=== 1.新建工程 ===
\\
双击{{:diamond图标.png?28|}}打开Lattice Diamond软件,点击**File—New—Project**新建工程,输入工程名称,指定工程保存目录,单击**Next**,选择设备如下:\\
* **Family**选择**MachXO2**,
* **Device**选择**LCMXO2-4000HC**,
* **Performance grade**选择**4**,
* **Package type**选择**CSBGA132**,
* **Operating conditions**选择**Commercial**,
* **Part Names**为**LCMXO2-4000HC-4MG132C**。
* 选择综合工具**Lattice LSE**,完成。\\
=== 2. 输入Verilog文件 ===
\\
点击**File—New—File**新建文件,类型选择**Verilog Files**,输入文件名称,选择保存路径,输入实验中的源代码后保存,编辑器会自动检查有无编辑错误,在下面的**Output**一栏会输出检查结果,如果有错误更正后重新保存直到没有报错为止。\\
\\
=== 3. 输入仿真文件 ===
\\
按照步骤**(2)**新建一个**Verilog**仿真文件,输入实验例程中仿真文件的代码后保存。在软件File List一栏中,右键单击“仿真文件”**—Include for—Simulation**,将文件设置为仿真文件(设置完成后文件图标的V会消失)。\\
\\
=== 4. 功能仿真 ===
\\
点击**Tools**选择**Simulation Wizard**或点击图标,按照仿真向导指示新建仿真工程,
* 输入工程名称,选择工程目录,选择**Simulator**为**Active-HDL**,
* **Process Stage**选择**RTL**,
* **Add and Reorder Source**:确认参与仿真的文件列表,**Next**
* **Parse HDL files for simulation**:软件会编译仿真文件,若报错需修改后重新仿真
* **Summary**:确认仿真工程信息,勾选**Run simulator**、**Add top-level signals to waveform display和Run simulation**,然后**Finish**
仿真软件会自动启动、运行仿真并显示仿真结果。查看仿真结果是否符合预期功能,如果不符合电路功能,则修改Verilog代码保存后,在**Active-HDL**中选择**Design—Compile All** 重新编译文件,编译通过后,在**Simulation**中重新开始仿真。
\\
\\
=== 5. 综合 ===
\\
在Lattice Diamond软件的**Process**一栏,双击第一项**Synthesize Design**进行综合(确保仿真文件设置为**simulation**后不参与综合),综合结果会在下面的**Output**一栏中给出,如果有错误则修改Verilog文件后重新综合直至综合成功为止。
\\
\\
=== 6. 分配管脚 ===
\\
打开**Tools—Spreadsheet View**或是点击图标{{::分配管脚.png|}}在**Port Assignments**一栏中对输入输出信号分配引脚。
\\
\\
=== 7. 布局布线 ===
\\
双击**Process**一栏的**Map Design**和**Place & Route Design**完成**FPGA**内部的布局布线。
\\
\\
=== 8. 生成配置文件 ===
\\
勾选并双击**JEDEC File**生成可下载的**jed**文件。
\\
\\
=== 9. 下载 ===
\\
打开**Tools—Programmer**或单击图标,根据下图选择设备和下载文件,点击上面的绿色按钮**Program**,下载**jed**文件到FPGA,下载成功后**Status**状态显示**PASS**(下载前确保下载器驱动成功安装)。
{{:下载成功.png|}}
观察开发板现象。