收藏 分销(赏)

哈工大数电大作业.doc

上传人:精**** 文档编号:3676929 上传时间:2024-07-13 格式:DOC 页数:20 大小:6.68MB 下载积分:10 金币
下载 相关 举报
哈工大数电大作业.doc_第1页
第1页 / 共20页
哈工大数电大作业.doc_第2页
第2页 / 共20页


点击查看更多>>
资源描述
Harbin Institute of Technology 数字电子技术基础大作业 课程名称: 数字电子技术基础 设计题目: 血型与状态机 院 系: 班 级: 设 计 者: 学 号: 哈尔滨工业大学 血型逻辑电路设计 一 实验目的 1. 掌握采用可编程逻辑器件实现数字电路与系统的方法。 2. 掌握采用Xilinx_ISE软件开发可编程逻辑器件的过程。 3. 学会设计血型能否输血的数字电路。 4. 掌握Verilog HDL描述数字逻辑电路与系统的方法。 二 设计要求 1. 采用BASYS2开发板开关,LED,数码管等制作验证能否输血的电路。 2. 采用Xilinx_ISE软件进行编程、仿真与下载设计到BASYS2开发板。 三 电路图 1. 电路模块图(简化) 应用: 2. 内部电路组成(简化) 四 编程 1.源程序 module xuexing(M, N, P, Q, E,F,G,OUT,CTL,clk,bi); input M; input N; input P; input Q; input clk; output E; output[3:0] F; output[3:0] G; output[7:0] OUT; output[3:0] CTL; reg E; reg[3:0] F; reg[3:0] G; reg[7:0] OUT; reg[7:0] OUT1; reg[7:0] OUT2; reg[7:0] OUT3; reg[7:0] OUT4; reg[3:0] CTL=4'b1110; output bi; reg bi; integer clk_cnt; reg clk_400Hz; always @(posedge clk) //400Hz扫描信号 if(clk_cnt==32'd100000) begin clk_cnt <= 1'b0; clk_400Hz <= ~clk_400Hz; end else clk_cnt <= clk_cnt + 1'b1; //位控制 reg clk_1Hz; integer clk_1Hz_cnt; //1Hz发声信号 always @(posedge clk) if(clk_1Hz_cnt==32'd25000000-1) begin clk_1Hz_cnt <= 1'b0; clk_1Hz <= ~clk_1Hz; end else clk_1Hz_cnt <= clk_1Hz_cnt + 1'b1; always @(posedge clk_400Hz) CTL <= {CTL[2:0],CTL[3]}; //段控制 always @(CTL) case(CTL) 4'b0111: OUT=OUT1; 4'b1011: OUT=OUT2; 4'b1101: OUT=OUT3; 4'b1110: OUT=OUT4; default:OUT=4'hf; endcase always @(M or N or P or Q) begin E=(P&Q)|(~M&~N)|(~M&Q)|(~N&P); //选择能否输血 case(E) 1: begin OUT1=8'b10001001; OUT2=8'b01100001; OUT3=8'b01001001; OUT4=8'b11111111; bi=clk_400Hz; end 0: begin OUT1=8'b00010011; OUT2=8'b00000011; OUT3=8'b11111111; OUT4=8'b11111111; bi=clk_1Hz; end endcase end always @(M or N or P or Q) //显示输入输出血型 begin if(M==1&&N==0) F=4'b1000; else if(M==0&&N==1) F=4'b0100; else if(M==1&&N==1) F=4'b0010; else F=4'b0001; end always @(M or N or P or Q) //显示输入输出血型 begin if(P==1&&Q==0) G=4'b1000; else if(P==0&&Q==1) G=4'b0100; else if(P==1&&Q==1) G=4'b0010; else G=4'b0001; end endmodule 2.管脚定义程序 NET "M" LOC=N3; NET "N" LOC=E2; NET "P" LOC=L3; NET "Q" LOC=P11; NET "E" LOC=B2; NET "OUT[7]" LOC = L14; NET "OUT[6]" LOC = H12; NET "OUT[5]" LOC = N14; NET "OUT[4]" LOC = N11; NET "OUT[3]" LOC = P12; NET "OUT[2]" LOC = L13; NET "OUT[1]" LOC = M12; NET "OUT[0]" LOC = N13; NET "CTL[3]" LOC = K14; NET "CTL[2]" LOC = M13; NET "CTL[1]" LOC = J12; NET "CTL[0]" LOC = F12; NET "clk" LOC=B8; NET "F[3]" LOC=G1; NET "F[2]" LOC=P4; NET "F[1]" LOC=N4; NET "F[0]" LOC=N5; NET "G[3]" LOC=P6; NET "G[2]" LOC=P7; NET "G[1]" LOC=M11; NET "G[0]" LOC=M5; NET "bi" LOC=B6; 五 仿真图 六 下载设计到BASYS2开发板与实物图 实物图: 附:程序流程: 1.基本电路设计 用MN表示输入血型,PQ表示受血者血型其中10表示A型,01表示B型,11表示AB型,00表示O型。用E表示能否输血,1表示能,0表示不能。 M N P Q E M N P Q E 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 则卡诺图为: MN PQ 00 01 11 10 00 1 0 0 0 01 1 1 0 0 11 1 1 1 1 10 1 0 0 1 表达式为: 则设计一个四输入一输出的电路 其逻辑电路图为 通过此电路图,编写程序,把输入引脚定位到开关上,把输出引脚定位到一个LED上便可以完成设计任务。 2.项目创新 (1)仅使用一个LED的亮与灭来表示能否输血效果不明显,为了加入一个更明显显示能否输血的指示,所以就用到了Basys2板子上自带的数码管,使其在能够输血时显示yes,不能输血时显示no。 观察硬件电路图发现,数码管只由一个片选端控制,所有如果使数码管显示不同字母,则需要利用人类的视觉暂留效应进行循环扫描,来使数码管来显示不同的信息。 (2)为了增强能否输血的提示效果,所以加入一个蜂鸣器,用声音提示能否输血。当系统开启切能输血时,蜂鸣器输出一低音震荡,当不能输血时,蜂鸣器输出高音报警,提示不能输血。 (3)在加入蜂鸣器报警与数码管之后,使用LED来表示能否输血已经多余,而且别人无法判断输血与受血分别是什么血型,所以把8个LED分成两组,其中第一组表示输血血型,第二组表示受血血型,第一个灯表示A型,第二个灯表示B型,第三个灯表示AB型,最后一个灯表示O型。 时序逻辑电路设计 一 实验目的 1.掌握采用可编程逻辑器件实现数字电路与系统的方法。 2.掌握采用Xilinx_ISE软件开发可编程逻辑器件的过程。 3.学会设计状态机时序逻辑电路。 4.掌握Verilog HDL描述数字逻辑电路与系统的方法。 二 设计要求 1.采用BASYS2开发板开关,LED,数码管等制作验证能否输血的电路。 2.采用Xilinx_ISE软件进行编程、仿真与下载设计到BASYS2开发板。 三 电路图 1.电路模块图 2.内部电路组成 四 编程 1.源程序 module Shixu(clk,op,din,B,C,D,E,F,G,H,I,BI,OUT,CTL); input clk; input din; output BI,op; output[7:0] OUT; output[3:0] CTL; output B,C,D,E,F,G,H,I; reg[7:0] OUT; reg[7:0] OUT1; reg[7:0] OUT2; reg[7:0] OUT3; reg[7:0] OUT4; reg[3:0] CTL=4'b1110; reg B,C,D,E,F,G,H,I; reg[1:0] current_state,next_state; reg op,BI; parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11; reg clk_1Hz,clk_400Hz; integer clk_1Hz_cnt,clk_cnt; always @(posedge clk) if(clk_1Hz_cnt==32'd25000000-1) begin clk_1Hz_cnt <= 1'b0; clk_1Hz <= ~clk_1Hz; end else clk_1Hz_cnt <= clk_1Hz_cnt + 1'b1; always @(posedge clk) if(clk_cnt==32'd100000) begin clk_cnt <= 1'b0; clk_400Hz <= ~clk_400Hz; end else clk_cnt <= clk_cnt + 1'b1; reg clk_05Hz; integer clk_05Hz_cnt; always @(posedge clk) if(clk_05Hz_cnt==32'd50000000-1) begin clk_05Hz_cnt <= 1'b0; clk_05Hz <= ~clk_05Hz; end else clk_05Hz_cnt <= clk_05Hz_cnt + 1'b1; reg clk_2Hz; integer clk_2Hz_cnt; always @(posedge clk) if(clk_2Hz_cnt==32'd12500000-1) begin clk_2Hz_cnt <= 1'b0; clk_2Hz <= ~clk_2Hz; end else clk_2Hz_cnt <= clk_2Hz_cnt + 1'b1; reg clk_4Hz; integer clk_4Hz_cnt; always @(posedge clk) if(clk_4Hz_cnt==32'd6250000-1) begin clk_4Hz_cnt <= 1'b0; clk_4Hz <= ~clk_4Hz; end else clk_4Hz_cnt <= clk_4Hz_cnt + 1'b1; reg clk_40Hz; integer clk_40Hz_cnt; always @(posedge clk) if(clk_40Hz_cnt==32'd1250000-1) begin clk_40Hz_cnt <= 1'b0; clk_40Hz <= ~clk_40Hz; end else clk_40Hz_cnt <= clk_40Hz_cnt + 1'b1; always @(posedge clk_400Hz) CTL <= {CTL[2:0],CTL[3]}; always @ (posedge clk_05Hz) begin current_state<=next_state; end always @(CTL) case(CTL) 4'b0111: OUT=OUT1; 4'b1011: OUT=OUT2; 4'b1101: OUT=OUT3; 4'b1110: OUT=OUT4; default:OUT=4'hf; endcase always @(current_state or din) begin case(current_state) S0: begin op=0; B=1;C=1;D=0;E=0; F=0;G=0;H=0;I=0; OUT1=8'b01001001; OUT2=8'b00000011; OUT3=8'b11111111; OUT4=8'b00000011; BI=clk_1Hz; if(din==0) next_state=S0; else next_state=S1; end S1: begin op=0; B=0;C=0;D=1;E=1; F=0;G=0;H=0;I=0; OUT1=8'b01001001; OUT2=8'b10011111; OUT3=8'b11111111; OUT4=8'b00000011; BI=clk_2Hz; if(din==0) next_state=S0; else next_state=S2; end S2: begin op=0; B=0;C=0;D=0;E=0; F=1;G=1;H=0;I=0; OUT1=8'b01001001; OUT2=8'b00100101; OUT3=8'b11111111; OUT4=8'b00000011; BI=clk_4Hz; if(din==0) next_state=S0; else next_state=S3; end S3: begin op=1; B=0;C=0;D=0;E=0; F=0;G=0;H=1;I=1; OUT1=8'b01001001; OUT2=8'b00001101; OUT3=8'b11111111; OUT4=8'b10011111; BI=clk_40Hz; if(din==0) begin next_state=S0; end else next_state=S3; end default: begin op=0; B=1;C=1;D=0;E=0; F=0;G=0;H=0;I=0; next_state=S0; end endcase end endmodule 2.管脚定义程序 NET "din" LOC=N3; NET "op" LOC=C6; NET "B" LOC=G1; NET "C" LOC=P4; NET "D" LOC=N4; NET "E" LOC=N5; NET "F" LOC=P6; NET "G" LOC=P7; NET "H" LOC=M11; NET "I" LOC=M5; NET "clk" LOC=B8; NET "BI" LOC=B6; NET "OUT[7]" LOC = L14; NET "OUT[6]" LOC = H12; NET "OUT[5]" LOC = N14; NET "OUT[4]" LOC = N11; NET "OUT[3]" LOC = P12; NET "OUT[2]" LOC = L13; NET "OUT[1]" LOC = M12; NET "OUT[0]" LOC = N13; NET "CTL[3]" LOC = K14; NET "CTL[2]" LOC = M13; NET "CTL[1]" LOC = J12; NET "CTL[0]" LOC = F12; 五 仿真图 六 下载设计到BASYS2开发板与实物图 实物图: 附:为了更好的说明各状态,我对蜂鸣器加入了不同的发声频率区分。 七 实验结论 经实验验证,此程序可以完成预期要求,完成特定任务。 八 心得体会 本次大作业让我熟悉了开发板的使用与可编程逻辑器件的应用,我了解了如何设计开发一个FPGA逻辑电路的流程,我以后懂得了可以使用FPGA来完成以后的一些工作,对我有很大的帮助。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 远程教育/电大

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服