资源描述
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来完成以后的一些工作,对我有很大的帮助。
展开阅读全文