前言
之所以开设“前人种树”专栏,是因为笔者十分推崇某位牛马前辈,当初刚入学对实验一筹莫展时偶然接触到这位前辈分享的材料,且不说对我有没有帮助,反正从那以后我经常看他分享的实验材料。慢慢地看多了之后才发现,原来这位前辈发材料的初衷可能没有我想的那么高尚,不是为了作为前人种树让后来人乘凉的,纯纯为了炫耀。为什么这么说呢?因为基本上他所有的公开分享的材料,都是要么缺斤少两,要么就在某个细节上把原来正确的改成错的。而他收费恰米的材料,都是完全正确可以直接拿来用的。
所以我呢,就把自己的实验材料也做个分享,不缺斤少两,更不故意把对的改成错的让后面的学弟们找半天,故意捉弄人嘛这不是?【楽】希望我这个种树的前人能对后人们有些许帮助,也希望各位是在弄懂我的东西后才去套用甚至自创。
扯远了,该实验是个人实验,由于疫情原因,数电实验是在线上验收的,笔者当时在家玩得太嗨了,而且相关知识老师不教纯靠自学(后来了解到并非所有老师都不教,只是刚好笔者老师不教,学弟学妹们选课时避坑c老师即可),本来就是似懂非懂半桶水功夫,只拿了个良,实验做完之后也根本用不到,且笔者如今回首整理资料,时间间隔久远,就忘了。所以各位看官有不懂的知识细节或者是软件使用方法问笔者大概率是不会的,关于实验细节只记得最后一个实验是按照学号最后一位定的;也不用向笔者要源码,因为笔者刚刚找了下,发现当初的源码删光了,实在是爱莫能助。
《数字逻辑与数字系统设计》综合实验
任 务 书
一、 目的与要求
- 目的
- 掌握组合逻辑电路的分析和设计方法。
- 掌握时序逻辑电路的分析和设计方法。
- 掌握用数字集成电路实现数字系统的方法。
- 要求
- 运用所学的知识和方法采用最佳方案完成实验设计。
- 认真书写实验报告,包括实验目的、实验内容、实验设计方案、实验仿真结果等。
二、 主要内容
- 组合逻辑电路实验
- 用任意门电路实现半加器。
- 用二输入端与非门电路实现全加器。
- 设计并实现2-4线译码器。
- 设计并实现三变量非一致电路。
要求:采用VHDL的结构描述法完成实验。
- 时序逻辑电路实验
- D触发器。
- 用D触发器实现模8计数器。
- 用D触发器实现模10计数器。
- 设计并实现环形移位型三节拍信号发生器。
- 设计并实现11序列检测器。
要求:采用VHDL的结构描述法完成实验。
- EDA秒表设计实验
- 基本实验。
输入为1kHZ脉冲,通过分频实现秒脉冲,用两位数码管LED2和LED1显示秒的十位和个位,实现从00到99的按秒计数。
-
- 扩展实验。
在秒表的基础上,增加一位数码管LED3,实现分、秒的计时。即LED3显示分的个位;LED2和LED1显示秒的十位和个位。完成程序的编写、调试与仿真。
要求:可采用VHDL的各种描述法完成实验。
- EDA综合设计实验
从给定题目中选择一个,完成设计的全过程,包括电路结构设计,各模块电路设计、系统调试及仿真。
实验题目另附任务书。
三、 进度计划
序号 |
设计(实验)内容 |
完成时间 |
备注 |
1 |
组合逻辑电路实验 |
14周 |
|
2 |
时序逻辑电路实验 |
15周 |
|
3 |
EDA秒表设计实验 |
16周 |
|
4 |
EDA综合设计实验 |
17周 |
|
四、 设计(实验)成果要求
- 线上实验要求
- 按任务书要求完成相应内容,所有实验均在Xilinx ISE 软件平台完成。
- 实验过程与结果采用腾讯会议录制视频,要求出镜说明班级姓名,然后讲解实验。
- 撰写实验报告册,包括实验内容、实验设计方案以及实验结果等,要求格式规范、书写认真,并及时提交实验报告。
- 杜绝程序及报告抄袭行为,一经发现均判为不及格。
五、 考核方式
- 总成绩=验收成绩+报告成绩
- 验收要求
- 实验一、二和三根据提交视频展示的实验过程和结果进行验收。
- 实验四根据每位同学的实验过程和结果验收,并对完全完成实验四的同学进行线上答辩。
学生姓名:
指导教师:
实验一 半加器实验
一、实验目的
1.熟悉门电路逻辑功能,用门电路实现半加器。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.二输入端四与门 74LS08 1片
3.二输入端四异或门 74LS86 1片
三、实验设计过程与步骤
1.真值表
2.函数表达式
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
(实验结果真值表)
四、实验难点和心得体会
虽然很基础,但万事开头难,特别是没人带的时候,自学走了很多弯路,要一直试错,占用了很多时间精力。有许多使用方面上的不熟悉造成了许多的错误,后来通过不断试错找到了自己存在的不足,在设计门电路的时候也遇到了一些困难,最后都成功的解决了。
实验二 全加器实验
一、实验目的
1.熟悉门电路逻辑功能,用二输入端与非门电路实现全加器。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.二输入端四与非门 74LS00 1片
三、实验设计过程与步骤
1.真值表
2.函数表达式
S=A⊕B⊕Cin,
Co=AB+BCin+ACin,
(其中A,B为要相加的数,Cin为进位输入,S为和,Co是进位输出。)
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
(实验结果真值表)
四、实验难点和心得体会
在半加器基础上的改进,比较好上手。
实验三 带使能端的译码器实验
一、实验目的
1.熟悉门电路逻辑功能,用门电路实现译码器,并与集成译码器74138比较。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.二输入端四与门 74LS08 1片
3.六反相器(非门)74LS04 1片
4.二输入端四与非门 74LS00 1片
三、实验设计过程与步骤
1.真值表
2.函数表达式
在使能端E置0的条件下:
使能端E置1,输出均为0.
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
(实验结果真值表)
四、实验难点和心得体会
刚开始忘了加上使能端,写完之后才发现,就重新改电路图,只是在四个与门都多加上一个输入端供EN(E的非)输入。
实验四 三变量非一致电路实验
一、实验目的
1.熟悉门电路逻辑功能,用门电路实现三变量非一致电路。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.使用实验扩展板可用门电路。
三、实验设计过程与步骤
1.真值表
2.函数表达式
F=A^B^C^+ABC
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
(实验结果真值表)
四、实验难点和心得体会
难度不大。
实验五 D触发器实验
一、实验目的
1.熟悉门电路逻辑功能,用与非门实现D触发器(D型锁存器),理解D触发器(D型锁存器)的工作原理及空翻现象。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.二输入端四与非门 74LS00
三、实验设计过程与步骤
1.状态表
2.状态方程
Qn+1=D
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
四、实验难点和心得体会
万事开头难,时序逻辑电路的第一个实验不好做。
实验六 用D触发器实现模8计数器
一、实验目的
1.熟悉触发器的逻辑功能。
2.掌握计数器的概念,实现方法和应用。
二、实验器件和仪表
1. 数字逻辑扩展板 1块。
2.使用实验扩展板可用门电路及D触发器。
三、实验设计过程与步骤
1.状态图与状态表
2.输出与激励函数表达式以及状态方程
C=Q0Q1Q2
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
四、实验难点和心得体会
难做。
实验七 用D触发器实现模10计数器
一、实验目的
1.熟悉触发器的逻辑功能。
2.掌握计数器的概念,实现方法和应用。
二、实验器件和仪表
1. 数字逻辑扩展板 1块。
2.使用实验扩展板可用门电路及D触发器。
三、实验设计过程与步骤
1.状态图与状态表
讨论:
由于触发器表示的状态大于有效状态,故将无效状态的激励函数作出,发现不会处于挂起状态,但会输出错误的1状态,故将1011,1101,1111的状态输出改为0.即z的表达式修改为Z=Q3Q2’Q1’Q0;
2.输出与激励函数表达式以及状态方程
D3=Q2Q1Q0+Q3Q0’;
D2=Q2Q1’+Q2Q0’+Q2’Q1Q0;
D1=Q1Q0’+Q3’Q1’Q0;
D0=Q0’;
Z=Q3Q2’Q1’Q0;
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
四、实验难点和心得体会
比上一个还难做,还要考虑无效状态的挂起和错误输出。
实验八 环形移位型三节拍信号发生器
一、实验目的
1.熟悉触发器的逻辑功能。
2.掌握移位寄存器的概念,实现方法和应用。
3. 用D触发器和基本门电路实现具有自启动的环形移位型三节拍信号发生器。
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.使用实验扩展板可用门电路及触发器
三、实验设计过程与步骤
1.状态图与状态表
2.输出与激励函数表达式以及状态方程
D2=Q3’Q2’;
D1=Q3;
D0=Q2;
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
四、实验难点和心得体会
很难,刚开始我连这个是个什么东西/要实现什么功能都不知道,上网查了半天。
实验九 11序列检测器
一、实验目的
1.熟悉触发器的逻辑功能。
2.掌握序列检测器的概念,设计方法。
3. 用D触发器和基本门电路实现“11”序列检测器
二、实验器件和仪表
1. 数字逻辑扩展板 1块
2.使用实验扩展板可用门电路及触发器
三、实验设计过程与步骤
1.状态图与状态表
2.输出与激励函数表达式以及状态方程
D2=XQ2+XQ1;
D1=XQ2’Q1’;
Z=Q2Q1’;
3.电路接线图(要求标注器件名称及每个门电路的管脚标号,实验时按设计的管脚编号连接电路)
4.实验结果与题目要求对比分析
四、实验难点和心得体会
难点:设计检测序列时,需要将状态进行合理的化简分配,同时明确各个状态的转化条件,在写出状态图的时候,由于选择了多于有效状态的触发器,需要进行讨论是否挂起和输出错误的输出,通过讨论得出将输出错误的无效状态改正后得到真正的输出函数表达式,完成合理的电路的设计。
体会:通过该次实验设计,我明白了如何进行设计序列检测器,如何通过将状态转化为编码进行电路的设计,同时也不能忘了了无效状态的讨论和分析。明白了11序列检测器该如何进行实验和其具体的电路原理分析。
实验十 EDA秒表设计实验
一、实验目的
1.熟悉使用ISE创建工程,运行、调试、仿真和下载实现的全过程。
2. 实现时钟分频、秒表计数的功能。
3. 在硬件平台上进行下载调试及实验验证。
二、实验器件和仪表
1. EDA扩展板 1块
三、实验设计过程与步骤
跟着教材一步步来即可。
四、Entity模型图和Entity及Architecture程序
entity clock is
Port ( clk : in STD_LOGIC;
rst : in STD_LOGIC;
seg1 : out STD_LOGIC_VECTOR (6 downto 0);
seg2 : out STD_LOGIC_VECTOR (6 downto 0));
end clock;
architecture Behavioral of clock is
signal clk_out:std_logic:= '0';
signal cnt:std_logic_vector (25 downto 0) := "00000000000000000000000000";
signal cnt_H:std_logic_vector(3 downto 0) := "0000";
signal cnt_L:std_logic_vector (3 downto 0) := "0000";
begin
process(clk)
begin
if(clk'event and clk='1')then
cnt<=cnt+'1';
if(cnt="00000000000000000000000000")then
clk_out<='0';
end if;
if(cnt="10111110101111000010000000")then
cnt<="00000000000000000000000000";
clk_out<='1';
end if;
end if;
end process;
process(clk_out,rst)
variable tmp_H,tmp_L:std_logic_vector(3 downto 0):="0000";
begin
if(rst='0')then
tmp_H:="0000";
tmp_L:="0000";
else
if(clk_out'event and clk_out='1')then
tmp_L:=cnt_L+'1';
if(tmp_L>"1001")then
tmp_L:="0000";
tmp_H:=cnt_H+'1';
if(tmp_H>"1001")then
tmp_H:="0000";
end if;
end if;
end if;
end if;
cnt_L<=tmp_L;
cnt_H<=tmp_H;
end process;
process(cnt_L)
begin
case cnt_L is
when"0000"=>seg1<=not"1000000";
when"0001"=>seg1<=not"1111001";
when"0010"=>seg1<=not"0100100";
when"0011"=>seg1<=not"0110000";
when"0100"=>seg1<=not"0011001";
when"0101"=>seg1<=not"0010010";
when"0110"=>seg1<=not"0000010";
when"0111"=>seg1<=not"1111000";
when"1000"=>seg1<=not"0000000";
when"1001"=>seg1<=not"0010000";
when others=>seg1<=not"1111111";
end case;
end process;
process(cnt_H)
begin
case cnt_H is
when"0000"=>seg2<=not"1000000";
when"0001"=>seg2<=not"1111001";
when"0010"=>seg2<=not"0100100";
when"0011"=>seg2<=not"0110000";
when"0100"=>seg2<=not"0011001";
when"0101"=>seg2<=not"0010010";
when"0110"=>seg2<=not"0000010";
when"0111"=>seg2<=not"1111000";
when"1000"=>seg2<=not"0000000";
when"1001"=>seg2<=not"0010000";
when others=>seg2<=not"1111111";
end case;
end process;
end Behavioral;
四、实验难点和心得体会
教材发的代码是错的,老师修改之后的版本仍然是错的,照着做反而走了许多弯路,其实只要自己用心琢磨,反而很快就做出来了。
实验十一 EDA综合实验
一、实验要求
1.从给定题目中选择一个,完成设计的全过程,包括电路结构设计,各模块电路设计及仿真,程序下载、系统调试以及实验总结报告,要求提前完成设计,在实验学时内只能进行电路下载调试及验收。
二、实验题目
0.交通控制器
基本要求:两个方向三色灯(红绿黄),行人路灯。定时转换,设置时间、强制转换。
1)东西方向为主干道,南北方向为副干道;
2)主干道通行40秒后,若副干道无车,仍主干道通行,否则转换;
3)换向时要有4秒的黄灯期;
4)副干道通行时间为20秒,到时间则转换,若未到时,但是南北方向已经无车,也要转换。
5)用数码管显示计时。
三、实验器件和仪表
1. EDA扩展板 1块
四、实验设计过程、步骤、关键结构图形描述、VHDL代码以及心得体会
(根据选定题目不同,自行描述,可附页)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRAFFIC_LIGHT IS
PORT(CLK,RST: IN STD_LOGIC;
LED: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --定义6个LED灯
WideSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的十位
WideSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的个位
NSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --支干倒计时的十位
NSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --支干倒计时的个位
END ENTITY TRAFFIC_LIGHT;
ARCHITECTURE bhv OF TRAFFIC_LIGHT IS
TYPE state IS(S0,S1,S2,S3); --枚举状态类型
SIGNAL current_s,next_s:state;
SIGNAL COUNT68:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
COUNT: PROCESS(RST,CLK) --辅助进程
BEGIN
IF RST= '1' THEN --异步清零
COUNT68<="00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF COUNT68<"01000011" THEN --B01000011=67设定68进制计数器
COUNT68<=COUNT68+1;
ELSE
COUNT68<="00000000";
END IF;
END IF;
END PROCESS;
REG: PROCESS (RST,CLK) --主控时序进程,用于机械地控制状态转换
BEGIN
IF RST= '1' THEN
current_s <= s0;
ELSIF clk='1' AND clk'EVENT THEN
current_s <= next_s;
END IF;
END PROCESS;
COM:PROCESS(current_s, COUNT68) --主控组合进程,用于设定状态转换的下一个状态
VARIABLE WESEG,NSSEG:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
CASE current_s IS
WHEN s0 => LED<= "010100";--主干绿灯亮,支干红灯亮
WESEG:=39-COUNT68; --主干绿灯倒计时,用于数码管显示
NSSEG:=43-COUNT68; --支干红灯倒计时
IF COUNT68 ="00100111" THEN --B00100111=39 控制状态转变
next_s<=s1;
ELSE
next_s<=s0;
END IF;
WHEN s1 => LED <= "001100"; --主干黄灯,支干红灯
WESEG:=43-COUNT68;
NSSEG:=43-COUNT68;
IF COUNT68 = "00101011" THEN --B00101011=43
next_s<=s2;
ELSE
next_s<=s1;
END IF;
WHEN s2 => LED <= "100010"; --主干红灯,支干绿灯
WESEG:=67-COUNT68;
NSSEG:=63-COUNT68;
IF COUNT68 ="00111111" THEN --B00111111=64
next_s <= s3;
ELSE
next_s <= s2;
END IF;
WHEN s3 => LED <= "100001"; --主干红灯,支干黄灯
WESEG:=67-COUNT68;
NSSEG:=67-COUNT68;
IF COUNT68 ="01000011" THEN --B01000011=67
next_s<= s0;
ELSE
next_s <= s3;
END IF;
WHEN OTHERS=> LED <="100100"; --否则都不能通行
END case;
IF WESEG>39 THEN --译码器的功能:将当前的倒计时转换成十进制,低四位和高四位分别是数码管的个位与十位,
--38+18=56D=38H=00111000B
--使数码管按照当前的计数(十进制)按二进制计数进行倒计时
WESEG:=WESEG+24;
ELSIF WESEG>29 THEN
WESEG:=WESEG+18;
ELSIF WESEG>19 THEN
WESEG:=WESEG+12;
ELSIF WESEG>9 THEN
WESEG:=WESEG+6;
ELSE NULL;
END IF;
IF NSSEG>39 THEN
NSSEG:=NSSEG+24;
ELSIF NSSEG>29 THEN
NSSEG:=NSSEG+18;
ELSIF NSSEG>19 THEN
NSSEG:=NSSEG+12;
ELSIF NSSEG>9 THEN
NSSEG:=NSSEG+6;
ELSE NULL;
END IF;
WideSEGH<=WESEG(7 DOWNTO 4);
WideSEGL<=WESEG(3 DOWNTO 0);
NSEGH<=NSSEG(7 DOWNTO 4);
NSEGL<=NSSEG(3 DOWNTO 0);
END PROCESS;
END ARCHITECTURE bhv;