数电实验自主设计—哈工大Harbin Institute of Technology数字电子技术实验自主设计实验报告姓名班级1404105 学号台号实验日期节次教师签字成绩实验名称:基于BASYS2 FPGA板的开发应用1.实验目的(1) 熟悉Verilog语言的使用(2) 能通过ISE软件进行FPGA简单的开放应用(3) 结合实际应用掌握课上所学关于组合电路和时序电路的理论知识(4) 掌握根据实际需求设计相应较为优化的电路的能力2. 实验环境ISE14.7BASYS2开发板3.实验内容总共设计3个实际应用电路,分别为两个较为简单的组合逻辑电路和一个较为复杂的时序逻辑电路。
下面分别介绍各个设计:(1)实验一:判断是否可以输血设计要求:已知人的血型由A、B、AB、O四种。
输血时,输血者的血型与受血者血型必须符合图中用箭头指示的授受关系。
要求该电路能够判断输血者与受血者的血型是否符合上述规定。
具体要求如图1所示。
图 1输血要求(2)实验二:显示译码电路设计要求:根据不同输入取值,依次显示“HIT+学号后5位(即HIT05108)”,共8个字型。
(3)实验三:数字钟设计要求:在数码管上显示分钟和秒的计时功能。
最左边两个显示分钟,最右边两个显示秒钟。
4.各实验源代码及仿真结果(1)实验一:判断是否可以输血Verilog程序:module shuxue(input a,input b,input ab,input o,input sa,input sb,input sab,input so,output reg w,output reg p); //a,b,ab,o分别代表输血者的四种血型sa,sb,sab,so分别代表受血者的四种血型;w代表W灯;p代表P灯reg w1,w2;always@(*)begincase({a,b,ab,o}) //判断输血者的输入是否符合要求4'b0001:w1=0;4'b0010:w1=0;4'b0100:w1=0;4'b1000:w1=0;default:w1=1; //若符合要求w1=0;否则w1=1endcasecase({sa,sb,sab,so}) //判断受血者的输入是否符合要求4'b0001:w2=0;4'b0010:w2=0;4'b0100:w2=0;4'b1000:w2=0;default:w2=1; //若符合要求w2=0;否则w2=1endcasew=w1||w2; //若输血者和受血者都符合要求w=0;否则w=1if(w==1)p = 0;else if(sa==1) //若受血者是A型血beginif(a==1||ab==1||o==1) //输血者是A,AB,O型血,p=1p=1;elsep=0;endelse if(sb==1) //若受血者是B型血beginif(b==1||ab==1||o==1) //输血者是B,AB,O型血,p=1p=1;elsep=0;endelse if(sab==1) //若受血者是AB型血beginif(b==1||a==1||o==1||ab==1) //输血者是A,B,AB,O型血,p=1p=1;elsep=0;endelse //若受血者是O型血beginif(o==1) //输血者是O型血,p=1p=1;elsep=0;endendendmodule引脚约束文件:NET "a" LOC=P11; NET "b" LOC=L3; NET "ab" LOC=K3; NET "o" LOC=b4; NET "sa" LOC=g3; NET "sb" LOC=f3; NET "sab" LOC=e2; NET "so" LOC=n3; NET "w" LOC=m11; NET "p" LOC=m5;仿真结果:数字电子技术基础设计作业10图 2实验一仿真波形图(2)实验二:显示译码电路(HIT05108) Verilog 程序:module da2( input [2:0] s, output reg[7:0] dl ); //s 表示8种输入;dl 控制8段数码管always@(s) begin case(s)3'b000:dl=8'b10010001; //s 输入为0,数码管显示H 3'b001:dl=8'b11110111; //s 输入为1,数码管显示I 3'b010:dl=8'b11100001; //s 输入为2,数码管显示T 3'b011:dl=8'b10011111; //s 输入为3,数码管显示1 3'b100:dl=8'b00000011; //s 输入为4,数码管显示0 3'b101:dl=8'b01001001; //s 输入为5,数码管显示5 3'b110:dl=8'b00000011; //s 输入为6,数码管显示03'b111:dl=8'b00000001;//s 输入为7,数码管显示8endcaseendendmodule管脚约束文件:NET "dl[7]" LOC = L14;NET "dl[6]" LOC = H12;NET "dl[5]" LOC = N14;NET "dl[4]" LOC = N11;NET "dl[3]" LOC = P12;NET "dl[2]" LOC = L13;NET "dl[1]" LOC = M12;NET "dl[0]" LOC = N13;NET "S[2]" LOC = K3;NET "S[1]" LOC = L3;NET "S[0]" LOC = P11; 仿真波形:图 3实验二仿真波形图(3)实验三:数字钟Verilog程序://顶层模块module clock_top(clk,duan,wei);input clk;output[7:0] duan;output[3:0] wei;wire clk_1Hz,clk_190Hz;wire[15:0] disp;clock_divf U1(.clk_50MHz(clk),.clk_1Hz(clk_1Hz),.clk_190Hz(clk_190Hz));clock_time U2(.clk_1Hz(clk_1Hz),.time_MS(disp));IP_smg_dsp U3(.clk_190Hz(clk_190Hz),.dat(disp),.duan(duan),.wei(wei)); endmodule//分频模块,得到1Hz,用于秒计数;得到190Hz,用于控制数码管显示//190Hz:这是4个数码管可以同时稳定显示的最低2n分频频率module clock_divf(clk_50MHz,clk_1Hz,clk_190Hz); input clk_50MHz;output clk_190Hz;output reg clk_1Hz;reg[25:0] cnt;assign clk_190Hz=cnt[17];always@(posedge clk_50MHz)if(cnt==25000000) //实际项目用,1s变化1次// if(cnt==250000) //测试用,加快100倍分钟/秒的变化begincnt=0;clk_1Hz=~clk_1Hz;endelse cnt=cnt+1;endmodule//计时模块,得到分和秒module clock_time(clk_1Hz,time_MS);input clk_1Hz;output[15:0] time_MS;reg[3:0] M_H,M_L,S_H,S_L;reg clk_SH,clk_ML,clk_MH;assign time_MS={M_H,M_L,S_H,S_L}; //时间:分、秒always@(posedge clk_1Hz)begin //秒:个位if(S_L==9)beginS_L=0;clk_SH=1;endelse beginS_L=S_L+1;clk_SH=0;endendalways@(posedge clk_SH)begin //秒:十位if(S_H==5)beginS_H=0;clk_ML=1;endelse beginS_H=S_H+1;clk_ML=0;endendalways@(posedge clk_ML)begin //分钟:个位if(M_L==9)beginM_L=0;clk_MH=1;endelse beginM_L=M_L+1;clk_MH=0;endendalways@(posedge clk_MH)begin //分钟:十位if(M_H==5)M_H=0;else M_H=M_H+1;endendmodule//4个数字扫描显示模块module IP_smg_dsp(clk_190Hz,dat,duan,wei); input clk_190Hz;input[15:0]dat;output reg[7:0]duan;output reg[3:0]wei;reg[3:0]disp;reg[1:0]smg_ctl;always@(posedge clk_190Hz)beginsmg_ctl=smg_ctl+1;case(smg_ctl)2'b00:beginwei=4'b1110;disp=dat[3:0];end2'b01:beginwei=4'b1101;disp=dat[7:4];end2'b10:beginwei=4'b1011;disp=dat[11:8];end2'b11:beginwei=4'b0111;disp=dat[15:12];endendcaseendalways@(disp)case(disp)0:duan=8'b11000000;1:duan=8'b11111001;2:duan=8'b10100100;3:duan=8'b10110000;4:duan=8'b10011001;5:duan=8'b10010010;6:duan=8'b10000010;7:duan=8'b11111000;8:duan=8'b10000000;9:duan=8'b10010000;10:duan=8'b10001000;11:duan=8'b10000011;12:duan=8'b11000110;13:duan=8'b10100001;14:duan=8'b10000110;15:duan=8'b10001110;default:duan=8'b11000000;//,默认为0 endcaseendmodule管脚约束文件:NET "wei[0]" LOC = F12; NET "wei[1]" LOC = J12; NET "wei[2]" LOC = M13; NET "wei[3]" LOC = K14; NET "duan[0]" LOC = L14; NET "duan[1]" LOC = H12; NET "duan[2]" LOC = N14; NET "duan[3]" LOC = N11; NET "duan[4]" LOC = P12; NET "duan[5]" LOC = L13; NET "duan[6]" LOC = M12; NET "duan[7]" LOC = N13;NET "clk" LOC=B8;仿真波形:图 4实验三仿真波形图5.实验结论(1)基于Verilog语言对FPGA开发板进行开发,可实现各种丰富的功能(2)进行模块化的编程可提高编写代码的效率,也易于debug6.实验中出现的问题及解决对策(1)问题:map和place&route环节需要过长时间解决:程序模块化,易于综合和布线(2)问题:bit文件导入FPGA可以正常实现功能,但仿真时一直出现z和x状态解决:应该给中间变量附上初值(3)问题:综合、转化为电路、生成bit等过程中会出现warning的情况解决:尽量消除warning,但是有warning并不会影响最终结果7.参考文献[1] 杨春玲. 数字电子技术基础. 北京 : 高等教育出版社, 2011 :409-411.[2] 贺敬凯. Xilinx FPGA应用开发. 北京: 清华大学出版社,2015.[3] 沈涛. Xilinx FPGA/CPLD设计初级教程. 西安: 西安电子科技大学出版社,2009.。