[转帖+自学]DE2_115_Digital_Logic Lab1
时间:2011-04-22 来源:spartan
Introduction
这个练习的目的是学习如何连接简单的输入、输出设备到一个FPGA芯片,并且用这些器件实现一个电路。我们将用DE2开发板上的switches SW17-0作为输入,用LED和7-segment displays作为输出。
完成DE2 实验练习1(Digital Logic)对与初学者来说是一个比较大的实验。我估计,每天要花几小时才能完成。这个实验包括6个部分,主要是组合逻辑电路和使用assign语句
Part I :第一次使用assign语句
Altera 的DE2开发板有18个拨动开关(toggle switch)和18个红色的LED。Part I非常简单,在实验手册里首先介绍了Verilog的格式,并给出了代码。需要自己做的部分就是把代码粘贴到Quartus II然后运行。当你拨动一个开关(比如Switch 1),对应的LED就会亮(比如LEDR1),这部分在实验手册里解释的很详细。
/***************Part1***************/
module lab1(SW,LEDR);
input[17:0] SW;
output[17:0] LEDR;
assign LEDR=SW;
endmodule
Part II:设计一个8位的2选1多路选择器
用Verilog设计一个多路选择器有很多种方法。但是在这个实验里,要求只能用门级电路描述。比如:assign m=(~s&x)|(s&y);这里x和y是输入,s是选择信号,m是输出。X被定义为SW 0到7,Y被定义为SW 8到15,S被定义为SW17,M被定义为绿色的LEDG 0到7.这部分的完整代码如下。
/***************Part2***************/
module lab1(LEDR,LEDG,SW);
input[17:0] SW;
output[17:0] LEDR;
output[7:0] LEDG;
wire S;
wire[7:0] X,Y,M;
assign S=SW[17];
assign X=SW[7:0];
assign Y=SW[15:8];
assign LEDR=SW;
assign LEDG=M;
mux2to1 m7(S,X[7],Y[7],M[7]);
mux2to1 m6(S,X[6],Y[6],M[6]);
mux2to1 m5(S,X[5],Y[5],M[5]);
mux2to1 m4(S,X[4],Y[4],M[4]);
mux2to1 m3(S,X[3],Y[3],M[3]);
mux2to1 m2(S,X[2],Y[2],M[2]);
mux2to1 m1(S,X[1],Y[1],M[1]);
mux2to1 m0(S,X[0],Y[0],M[0]);
endmodule
module mux2to1(s,x,y,m);
input x,y,s;
output m;
assign m=(~s&x)|(s&y);
endmodule
代码里,有一个小技巧。我把RTL代码分成2部分。1个主模块和1个多路选择器模块。通过调用多选器模块,可以很容易的实现设计。
Part III:设计一个3位的5选一多路选择器
/***************Part3***************/
module lab1(SW,LEDR,LEDG);
input[17:0] SW;
output[17:0] LEDR;
output[2:0] LEDG;
wire[2:0]s,u,v,w,x,y;
wire[2:0] m;
wire[2:0] m0,m1,m2;
assign LEDR=SW;
assign s=SW[17:15];
assign u=SW[14:12];
assign v=SW[11:9];
assign w=SW[8:6];
assign x=SW[5:3];
assign y=SW[2:0];
assign LEDG=m;
assign m0[0]=(~s[0]&u[0])|(s[0]&v[0]);
assign m0[1]=(~s[0]&u[1])|(s[0]&v[1]);
assign m0[2]=(~s[0]&u[2])|(s[0]&v[2]);
assign m1[0]=(~s[0]&w[0])|(s[0]&x[0]);
assign m1[1]=(~s[0]&w[1])|(s[0]&x[1]);
assign m1[2]=(~s[0]&w[2])|(s[0]&x[2]);
assign m2[0]=(~s[1]&m0[0])|(s[1]&m1[0]);
assign m2[1]=(~s[1]&m0[1])|(s[1]&m1[1]);
assign m2[2]=(~s[1]&m0[2])|(s[1]&m1[2]);
assign m[0]=(~s[2]&m2[0])|(s[2]&y[0]);
assign m[1]=(~s[2]&m2[1])|(s[2]&y[1]);
assign m[2]=(~s[2]&m2[2])|(s[2]&y[2]);
endmodule