西安电子科技大学
可编程逻辑器件原理、应用与实验 课程实验报告
实验名称 实验一 ---- 实验五
成 绩 电子工程学院 学院 162 班
成 绩
姓名 陈圆圆 学号 1602121053
同作者
实验日期 2017 年 4 月 8 日
指导教师评语:
指导教师:
年 月 日
实验报告内容基本要求及参考格式
实验一 4位减法、加法器设计
实验目的 (1) 任务:设计带借位、进位的 4 位二进制减法、加法器。
(2) 要求:要考虑借位、进位。在软件环境下,编写源文件,并
用器件实现
实验所用仪器(或实验环境)
操作软件diamond 2.0以及LATTICE XP2系列实验板。
实验基本原理及步骤(或方案设计及理论计算)
1、建立新工程jishuqi,选择器件,选择器件芯片family中选择Laattic XP2,Device选择LFXP2-5E,Part Names选择LFXP2-5E-6TN144C。
2、建立verilog源文件jishuqi。
3、综合,编译。
4、进行管脚分配,在此实验中,采用按键19开关为加、减法的选择,拨码开关55为是否有进位及借位,LED46为进位的显示,LED39、40、43、44分别为输出结果的显示。
5、程序的烧写。
在Diamond主界面中,进入Tools->Programmer,点击OK键,然后点击图标,在State栏出现PASS,即说明烧写成功。
实验数据记录(或仿真及软件设计)
module jishuqi (cbin,sum,cout,sel); //cbin表示进位或借位,sel表示选择加减法
input cbin;//定义进位或借位
input sel;
output sum,cout;
reg [3:0] sum;//寄存器长度设置
reg cout;
parameter a = 4'b1010, b = 4'b0110;//计算参量的设置
always@(sel)
begin
if(sel) //sel为1进行加法运算,否则进行减法运算
{cout,sum}=a + b + cbin;
else
{cout,sum}=a - b - cbin;//减法器
end
endmodule
实验结果分析及回答问题(或测试环境及测试结果)
加、减法的验证:
当不按按键19时,二极管37、44亮,39、40、43灭,即显示数字为01110验证为加法运算,结果正确。当按下按键19时,二极管37、39、43、44亮,40灭,即显示数字为00100,验证为减法运算,结果正确。
有进位、借位的加、减法验证:
松开按键19,且拨码开关拨向“1”,二极管37亮,39、40、43、44灭,即显示数字为01111,表示有进位。按下按键19,二极管37、39、40亮,43、44灭,即显示数字为00011,所以程序实现了带借位、进位的4位二进制减法、加法器。
心得体会:
时间过得真快,转眼间六次的理论教学已经结束了,怀着忐忑而又兴奋的心情开始了我的第一次可编程逻辑器件实验。由于在大学期间曾经接触过一些相关的理论知识并且在课堂上跟着田老师在课堂上加深了理论知识的学习,所以对于程序的编写比较容易上手。
但是在操作工程中将程序烧写到板子上之前要对管脚进行配置,由于对硬件结构不是很了解,所以操作起来耽误了很多时间也遇到了很多问题,不过最后也被解决了。所以我收获了,若是遇到问题不要逃避,要认真思考,积极对待。
实验二 序列检测器的设计与实现
一、实验目的 (1) 任务:设计序列检测器。
(2)功能要求:检测器有一个输入端X,被检测的信号为二进制序列串行输入,检测器有一个输出端Z,当二进制序列连续有四个1时,输出为1,其余情况均输出为0。
实验所用仪器(或实验环境)
操作软件diamond 2.0以及LATTICE XP2系列实验板。
实验原理及步骤
1.建立新工程seqdet,选择芯片family中选择laattic XP2,Device选择 LFXP2-5E,Part Names选择LFXP2-5E-6TN144C。
2.建立verilog源文件seqdet。
3.综合,编译。
4.进行管脚分配,在此实验中,采用按键19开关为rst复位键,LED37为检测结果输出,按键开关52为CLK信号的输入,按键开关50为待检测输入X。
5.程序的烧写。
在Diamond主界面中,进入Tools->Programmer,点击OK键,然后点击图标,在State栏出现PASS,即说明烧写成功。
三、实验数据记录(或仿真及软件设计)
module seqdet(x,z,clk,rst);
input x,clk,rst;
output z;
wire z;
reg [2:0] state;
parameter IDLE=3'b000,
s0=3'b001,
s1=3'b010,
s2=3'b011,
s3=3'b100;
assign z=(state==s3&&x==1)?1:0;
always @(posedge clk)
begin
if(!rst)
state<=IDLE;
else
case(state)
IDLE: begin
if(x==0)
state<=IDLE;
else
state<=s0;
end
s0: begin
if(x==0)
state<=IDLE;
else
state<=s1;
end
s1: begin
if(x==0)
state<=IDLE;
else
state<=s2;
end
s2: begin
if(x==0)
state<=IDLE;
else
state<=s3;
end
s3: begin
if(x==0)
state<=IDLE;
else
state<=IDLE;
end
default: state<=IDLE;
endcase
end
endmodule
四、实验结果分析及回答问题(或测试环境及测试结果)
1111序列的检测
复位信号的验证,按下按键开关19,并按一下按键开关52,LED37亮表示复位成功。因为是上升沿触发,所以输入1时按一下按键52CLK时对X是状态进行检测,如果X未被按下表示输出为1,按下表示输出为0,所以当仅按键52按下被按下4次时LED37熄灭。其他序列均为亮的状态。
五 、实验体会及实验中遇到的问题
本次实验相对于第一次实验在程序的编写方面加大了难度。虽然算法简单,但是实施起来还是有些困难。在进行实验之前我首先同时让我学会了如何将自己课堂上学习的理论知识与实际操作进行结合。也是收获了很多,程序编写能力得到了相应的锻炼。
实验三 变模计数器的设计
实验目的 (1) 任务:设计模为 9,11,13,15 的可变模计数器。
(2) 要求:能在键盘的控制下,实现变模计数。
(3) 在环境下,编写源文件,并用器件实现。
二、实验所用仪器(或实验环境)
操作软件diamond 2.0以及LATTICE XP2系列实验板。
实验基本原理及步骤
1. 打开操作软件diamond 2.0.
2. 建工程并选器件
新建工程file->new->project->next,然后在弹出来的对话框中填写相关内容shiyan5,在Location栏上选用上面已经建好的文件夹(F/yubin);
3. 建立源文件
新建项目file->new->file在对话框New File中,选择verilog;在name栏中输入文件名(shiyan5),点击FINISH,在Lattice Diamond主界面出现shiyan5.v,在TextEditer中编辑输入Verilog语言源程序并保存;
4. 综合
在主界面Process窗口中双击Translate Design,对所编辑的代码进行综合。
5. 管脚分配
在pin一栏中填入各输入输出映射的管脚。分配完管脚之后点击保存,在主界面Process框中,对Map Design,Place&Route Design,Export Files选中所有的选项,然后右键选中JEDEC File,单击其下拉菜单中的Rerun All;
管脚分配:clr:54 clk:53 input[1]:52 input[0]:50
output[3]:46 output[1]:45 output[1]:44 output[0]:43
6. 烧写程序
在Diamond主界面中,进入Tools->Programmer,点击OK键,然后点击图标,在State栏出现PASS,即说明烧写成功。
四、实验数据记录(或仿真及软件设计)
module shiyan5(clk,clr,s,cout);
input clk,clr;
input[1:0] s;
output[3:0] cout;
reg[3:0] cout;
always @(posedge clk)
begin
if(!clr) cout<=0;
else
case(s)
2'b00: if(cout>=4'b1000) cout<=0;
else cout<=cout+1;
2'b01: if(cout>=4'b1010) cout<=0;
else cout<=cout+1;
2'b10: if(cout>=4'b1100) cout<=0;
else cout<=cout+1;
2'b11: if(cout>=4'b1110) cout<=0;
else cout<=cout+1;
default: cout<=4'bxxxx;
endcase
end
endmodule
五、实验结果分析
同时按下52和50键,表示s=00,即进行模9运算,刚开始时,output[3]、output[2]、output[1]、output[0]为0000,按下、松开clk键多次,output[3]、output[2]output[1]output[0]0001,0010,0011,0100,0101,0110,0111,1000,0000,这样循环下去,每隔9次一循环。同时松开52和50键,表示s=11,即进行模15运算,结果和上例相似,只是每隔15次一循环。松开52,按下50键,表示s=10,即进行模13运算,结果和上例相似,只是每隔13次一循环。按下52,松开50键,表示s=10,即进行模11运算,结果和上例相似,只是每隔13次一循环。
心得体会:在完成本实验过程中加深了我对数字电路设计的理解,提高了我在电路设计上的能力,对verilog语言的使用更加熟练,为今后的实验打下了基础。在实验进行之前必须对原理进行掌握、理解,并且熟练将理论知识运用到实践中去,提高自己发现问题解决问题的能力。
实验四 流水灯设计
一、实验目的 (1)设计实验使发光二极管循环点亮。
(2)使实验板上7个发光二极管LD~LD7每隔3秒点亮一个,依次循环点亮。
(3)在环境下,编写源文件,用器件实现。
二、实验所用仪器(或实验环境)
操作软件diamond 2.0以及LATTICE XP2系列实验板。
实验基本原理及步骤(或方案设计及理论计算)
1、建立新工程lamp-water,选择器件,择芯片family中选择laattic XP2,Device选择LFXP2-5E,Part Names选择LFXP2-5E-6TN144C。
2、建立源文件lamp-water。
3、综合,编译.
4、进行管脚分配,在此实验中,使用按键开关19为rst清零信号,按键开关50为clk时钟信号,LED37,38,39,40,43,44,45分别显示7位输出。
5、程序的烧写。
实验数据记录(或仿真及软件设计)
module lamp-water(clk,rst,out);
input clk,rst;
output [6:0] out;
reg [6:0] out; //对应7个LED灯
reg clk_cnt;
reg [27:0] cnt; //计数
always @(posedge clk)
begin
if(!rst)
begin
cnt <= 0;
out <= 7'b0000001;
end
else
Begin
if(out == 7'b1000000 && cnt == 150000000)
begin
out <= 7'b0000001;
cnt <= 0;
end
else
begin
if(cnt == 150000000)
begin
out <= out<<1;
cnt <= 0;
end
else
cnt <= cnt+4'b0001;
end
end
end
endmodule
实验结果
按下rst键,使所有的灯都熄灭,每隔3s按下clk键,LED37,38,39,40,43,44,45从右至左依次点亮,并循环点亮。
该实验系统的频率为50MHZ,三秒即为150MHZ,为了可以循环进行灯的闪烁,定义一个新的变量step,进行循环,每隔3秒,step值不同,result的值也不同,对应于不同的灯的亮和灭。
在完成本实验过程中加深了我对数字电路设计的理解,提高了我在电路设计上的能力,同时也锻炼了我的逻辑思维能力和动手能力以及耐心。并且通过犯错的积累,提醒我在以后的学习以及生活中要保持严谨认真的态度。
实验五 出租车自动计费设计
实验要求
(1) 任务:自动计费模块。
(2) 要求:按键后开始计费,不按键时停止计费。
二、实验所用仪器(或实验环境)
操作软件diamond 2.0以及LATTICE XP2系列实验板。
三、实验基本原理及步骤(或方案设计及理论计算)
1.打开操作软件diamond 2.0.
2. 建工程并选器件
新建工程file->new->project->next,然后在弹出来的对话框中填写相关内容chuzuche,在Location栏上选用上面已经建好的文件夹(F/ chuzuche);
3. 建立源文件
新建项目file->new->file在对话框New File中,选择verilog;在name栏中输入文件名chuzuche,点击FINISH,在Lattice Diamond主界面出现chuzuche.v,在TextEditer中编辑输入Verilog语言源程序并保存;
4. 综合
在主界面Process窗口中双击Translate Design,对所编辑的代码进行综合。
5. 管脚分配
在pin一栏中填入各输入输出映射的管脚。分配完管脚之后点击保存,在主界面Process框中,对Map Design,Place&Route Design,Export Files选中所有的选项,然后右键选中JEDEC File,单击其下拉菜单中的Rerun All;
管脚分配:
clk:21 res:19 s_w:53
lucheng [0]:46 lucheng [1]:45 lucheng [2]:44 lucheng [3]:43
money [0]:40 money [1]:39 money [2]:38 money [3]:37
6. 烧写程序
在Diamond主界面中,进入Tools->Programmer,点击OK键,然后点击图标,在State栏出现PASS,即说明烧写成功。
数据记录
module chuzuche(clk,res,s_w,lucheng,money);
input clk,res,s_w; //s_w按下后才开始计费
output[3:0] lucheng; //
output[3:0] money;
reg[3:0] lucheng;
reg[3:0] money;
reg[28:0] count1;//计数器1
initial
begin
count1 = 0;
lucheng=4'b0000;
money=4'b0010;
end
always@(posedge clk)
begin
if(!s_w)//开关按下
begin
count1 = count1 + 1'b1;
if(count1 == 28'//里程计数
begin
lucheng = lucheng +4'b0001;
if(lucheng > 4'b00011)//超出起步里数
begin
money = money +4'b0001;
end
count1 = 0;
end
end
if(!res)
begin
count1 = 0;
lucheng=4'b0000;
money=4'b0010;
end
end
endmodule
实验结果
按下s_w,开始计费,起步价为2元,可坐3公里。从4公里起每公里加1元,按下res复位。
心得体会:实验原理相对来说比较简单,但是实现起来语言比较繁琐,但是只要认真编写还是可以做出来的。在实验过程中也误入了一些盲区,不过认真分析的话问题都迎刃而解了。