Contents
1 实验目的
2 实验仪器
3 子任务
3.1 四人表决器
- 实验原理
- 实验步骤
- 具体实现
- 问题解决
3.2 多用户呼叫器
- 实验原理
- 实验步骤
- 具体实现
- 问题解决
3.3 数值比较器
- 实验原理
- 实验步骤
- 具体实现
- 问题解决
4 心得体会
1 实验目的
利用 V e r i l o g Verilog Verilog 硬件描述语言、图形描述方式、 I P IP IP 核,结合数字系统设计方法,在 Q u a r t u s Quartus Quartus 开发环境下,对三个子任务进行实现。通过实验,理解组合逻辑的概念,掌握组合逻辑电路的设计方法。
2 实验仪器
- FPGA开发板( D E 1 − S o C DE1-SoC DE1−SoC)
3 子任务
3.1 四人表决器
实验原理
功能需求分析
- 4 4 4 人无弃权表决电路,多数赞成则提案通过。
- 3 3 3 人同意时灯不亮表示未通过,否则灯亮表示通过。
首先,用四个开关分别表示四人各自的投票器,根据开发板信息,开关外低内高。然后通过统计对应低电平状态管脚的个数来判断是否点亮 L E D LED LED (也就是把 L E D LED LED 对应管脚置为高电平)。程序的流程图如下:
实验步骤
具体实现
Q u a r t u s Quartus Quartus 程序编写
Codes
module vote (a,ok);
input [3:0] a; //用一个四位寄存器表示
output ok;
reg [3:0] cnt;
integer i;
reg ok;
always @ (a)
begin
cnt=0; //计数器清零
for (i=0; i<=3; i=i+1) //循环统计计数器寄存器内1的个数
if (a[i])
cnt=cnt+1;
if (cnt>=3)
ok=1;
else
ok=0;
end
endmodule
功能仿真分析
通过给四个输入设置不同频率的时钟信号激励实现四人投票的组合变化,如图所示。
下面给出三组测试数据
A A A | B B B | C C C | D D D | 期望输出 |
---|---|---|---|---|
1 1 1 | 1 1 1 | 0 0 0 | 0 0 0 | 不亮 |
1 1 1 | 1 1 1 | 0 0 0 | 1 1 1 | 亮 |
1 1 1 | 1 1 1 | 1 1 1 | 1 1 1 | 亮 |
Case 1
Case 2
Case 3
仿真结果证明程序逻辑正确。
四人表决器引脚分配
下载验证
Case 1:仅两人投票时不亮
Case 2:三人投票时 L E D LED LED 亮
Case 3:四人投票时 L E D LED LED 亮
3.2 多用户呼叫器
实验原理
功能需求分析
- 具有优先级的六用户呼叫器,显示用户编号并蜂鸣提示,当多用户同时呼叫时只显示优先级高的用户。
- 用 6 6 6 个开关模拟用户呼叫信号,用1个数码管显示用户编号。
首先,用六个开关分别表示六人各自的呼叫器,根据开发板信息,开关外低内高。然后从最高优先级用户( 6 6 6 号用户)开始逐一检查是否有用户呼叫,直到找到为止。程序的流程图如下:
实验步骤
具体实现
Q u a r t u s Quartus Quartus 程序编写
逻辑关系图
Codes
module call (user,ans);
input [7:0] user;
output reg [7:0] ans;
integer i;
reg [7:0] c;
//reg [7:0] ans;
always @ (user)
begin
c=0;
for (i=7; i>=2; i=i-1)
if (user[i])
if (i>=c)
c=i;
end
//seg(c);
always @ (c)
begin
//data,address,mode,ans1,ans2,ans3,ans4
ans[0]=1;
ans[1]=1;
ans[2]=1;
ans[3]=1;
ans[4]=1;
ans[5]=1;
ans[6]=1;
ans[7]=1;
case (c)
8'b0000_0010:begin
ans[1]=0;
ans[2]=0;
end
8'b0000_0011:begin
ans[0]=0;
ans[1]=0;
ans[6]=0;
ans[3]=0;
ans[4]=0;
end
8'b0000_0100:begin
ans[0]=0;
ans[1]=0;
ans[6]=0;
ans[3]=0;
ans[2]=0;
end
8'b0000_0101:begin
ans[1]=0;
ans[6]=0;
ans[5]=0;
ans[2]=0;
end
8'b0000_0110:begin
ans[0]=0;
ans[5]=0;
ans[6]=0;
ans[3]=0;
ans[2]=0;
end
8'b0000_0111:begin
ans[0]=0;
ans[5]=0;
ans[6]=0;
ans[3]=0;
ans[2]=0;
ans[4]=0;
end
default ans[1]=1;
endcase
end
//choice=c;
endmodule
功能仿真分析
仿真结果证明程序逻辑正确。
多用户呼叫器引脚分配方案
下载验证
样例解释:用户 5 5 5 和用户 3 3 3 , 2 2 2 , 1 1 1 同时呼叫,用户 5 5 5 优先级最高因此数码管显示 5 5 5 。
问题解决
一开始没注意这是共阴数码管,后面调成整为低电平有效就一切正常了。
3.3 数值比较器
实验原理
功能需求分析
- 用最少的与非门设计一个两位无符号二进制数比较器。
- 用四个开关作为两个两位二进制数的数据输入,比较结果分别用一组彩灯中的红、黄、绿色发光二极管显示。
首先,分别令这两个二进制数为 A 1 B 1 A_1B_1 A1B1 和 A 2 B 2 A_2B_2 A2B2 ,先比较两个二进制位的高位,如果 A 1 > A 2 A_1>A_2 A1>A2 则输出 Y 1 Y_1 Y1 (点亮红灯),否则如果 A 1 < A 2 A_1<A_2 A1<A2 则输出 Y 3 Y_3 Y3 (点亮绿灯),若 A 1 = A 2 A_1=A_2 A1=A2 ,则按上述方法比较 B 1 B_1 B1 和 B 2 B_2 B2 ,若两数相等,则输出 Y 2 Y_2 Y2 (点亮黄灯)。程序的流程图如下:
实验步骤
具体实现
Q u a r t u s Quartus Quartus 程序编写
逻辑关系图
Codes
module lx3(A1,B1,A2,B2,Y1,Y2,Y3);
input A1,B1,A2,B2;
output Y1,Y2,Y3;
wire T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11;
nand NA1 (T1,A1,A2),
NA2 (T5,B1,B2);
nor NO1 (T4,T2,T3),
NO2 (T8,T6,T7);
and AA1 (T2,T1,A1),
AA2 (T3,T1,A2),
AA3 (T6,T5,B1),
AA4 (T7,T5,B2),
AA5 (T9,T4,T6),
AA6 (Y2,T4,T8),
AA7 (T11,T4,T7);
or O1 (Y1,T2,T9),
O2 (Y3,T3,T11);
endmodule
功能仿真分析
通过给四个输入设置不同频率的时钟信号激励实现两个两位二进制数的组合变化,如图所示。
下面给出三组测试数据
A 1 A_1 A1 | B 1 B_1 B1 | A 2 A_2 A2 | B 2 B_2 B2 | 期望输出 |
---|---|---|---|---|
1 1 1 | 1 1 1 | 0 0 0 | 1 1 1 | Y 1 Y_1 Y1 |
1 1 1 | 1 1 1 | 1 1 1 | 1 1 1 | Y 2 Y_2 Y2 |
1 1 1 | 0 0 0 | 1 1 1 | 1 1 1 | Y 3 Y_3 Y3 |
Case 1
Case 2
Case 3
仿真结果证明程序逻辑正确。
数值比较器引脚分配方案
下载验证
Case 1: ( 10 ) 2 = = ( 10 ) 2 (10)_2==(10)_2 (10)2==(10)2 , 中间的 L E D LED LED 灯亮
Case 2: ( 10 ) 2 < ( 11 ) 2 (10)_2<(11)_2 (10)2<(11)2, 左边的 L E D LED LED 灯亮
Case 3: ( 01 ) 2 > ( 00 ) 2 (01)_2>(00)_2 (01)2>(00)2,右边的 L E D LED LED 灯亮
问题解决
难点主要是两位数值比较器的逻辑实现,这个分析清楚了代码实现没难度。