EDA与电子技术课程设计
教材,EDA与数字系统设计
李国丽 朱维勇 栾铭主编
绪论
? 门电路、触发器等称为逻辑器件;
? 由逻辑器件构成,能执行某单一功能的
电路,如计数器、译码器、加法器等,
称为逻辑功能部件;
? 由逻辑功能部件组成的能实现复杂功能
的数字电路称数字系统。
图 0-1 数字系统框图
数字系统设计方法简介
? 明确设计要求,确定系统的输入 /输出 ;
? 确定整体设计方案 ;
? 自顶向下( top-down)的模块化设计方
法 。
数字系统的设计层次
? 选用通用集成电路芯片构成数字系统;
? 应用可编程逻辑器件实现数字系统;
? 设计专用集成电路 (单片系统 )。
? 应用可编程逻辑器件 ( Programmable Logic
Device PLD) 实现数字系统设计, 是目前利
用 EDA(Electronic Design Automation )技术
设计数字系统的潮流 。
? 这种设计方法以数字系统设计软件为工具,
将传统数字系统设计中的搭建调试用软件仿
真取代, 对计算机上建立的系统模型, 用测
试码或测试序列测试验证后, 将系统实现在
PLD芯片或专用集成电路上, 这样最大程度地
缩短了设计和开发时间, 降低了成本, 提高
了系统的可靠性 。
PLD简介
? 数字集成电路的发展过程:
电子管
晶体管
小中规模集成电路( SSI,MSI)
大规模集成电路( LSI)
超大规模集成电路 (VLSIC)
具有特定功能的专用集成电路 (Application
Specific Integrated Circuit ASIC)
为使 ASIC的设计周期尽可能短,出现
了现场可编程逻辑器件 (Field Programmable
Logic Device FPLD),其中应用最广泛的当
属 CPLD和 FPGA。
CPLD,Complex Programmable Logic
Device
FPGA, Field Programmable Gate Array
统称为 PLD或 CPLD/FPGA。
PLD发展过程
? 早期,PROM,EPROM, EEPROM
? 70年代中期,Programmable Logic array PLA
? 70年代末:美国 MMI公司 Programmable array
Logic PAL
? 80年代中期,Altera公司 Generic Array Logic
GAL
共同特点:低密度 PLD,结构简单, 设计灵活,
规模小, 难以实现复杂的逻辑功能 。
PLD发展过程
? 80年代中期,Altera公司 Erasable Programmable
Logic Device EPLD
? 1985年,Xilinx公司 Field Programmable
Gate Array FPGA
? 80年代末,Lattice公司提出 In System
Programmable ISP)技术,相继出现了一系列
具备在系统可编程能力的复杂可编程逻辑器件
(Complex Programmab1e Logic Device CPLD)。
共同特点:高密度、高速度、低功耗结构体系
更灵活、适用范围更宽,设计风险为零。
PLD发展过程
? 90年代以后,高密度 PLD在生产工艺、
器件的编程和测试技术等方面都有了飞
速发展,CPLD的集成度一般可达数千甚
至上万门 。
Altera的 EPF10K10每片含 62000?158000
个可使用门,重复擦写次数达 10万次以
上。
? PLA,PAL,GAL,EPLD,FPGA,ISP-
PLD的基本结构在, 数字电子技术基础,
的第八章有介绍
EDA软件种类及各自特点
专门用于开发 FPGA和 CPLD的 EDA工具分为五
个模块:
1, 设 计 输入 编辑 器 ( xilinx 的 Foundation,
Altera的 MAX+plus2等 ) ;
2, 仿真器 ( 如 Mentor 公 司 的 ModelSim,
Cadence公司的 Verilog-XL,NC-Verilog等 ) ;
3, HDL 综合器 ( Synopsys 公司的 FPGA
Compiler,FPGA Express 等 ) ;
4,适配器 ( 或部局布线器 ) ( 如 Lattice公司的
ispEXPERT 中有自己的适配器 ) ;
5,下载器 ( 编程器 ) 。
MAX+Plus210.0(学生版 )支持的器件
1,EPF10K10,EPF10K10A等
2,MAX7000系列(如 MAX7000S中的
MAX7128)
3,EPM9320等
MAX+plus2使用练习
? 图形输入方式(,gdf文件);
? HDL (Hardware Description Language)语
言输入方式
1)VHDL语言 ( Very High Speed
Intergated Circuit Hardware Description
Language)
2)Verilog HDL语言
设计过程
设计输入
图形或 HDL语言
输入
编译
Compiler
项目校验、
仿真
Simulate
编程或下载
Program或
Configure
步骤
? 进入 Windows操作系统,打开 MAX+Plus2;
? 启动 File\Project\Name 菜单,输入设计文件的
名称 (给出文件存储路径);
? 点击 Assign\Device菜单,选择器件
( EPM7128SLC84-6或 EPF10K10LC84-4);
? 启动 File\New菜单,选择 Graphic Editor,打开
原理图编辑器;
原理图设计输入过程
? 元器件放置;
? 在元器件之间添加连线;
? 添加输入、输出引脚,并给它们命名;
? 保存原理图。
编译
? 启动 MaxplusII/Compiler菜单,选择 Start,
开始编译;
? 若电路有错,编译器停止编译,并显示
出错信息;
? 若电路无错,则编译通过,生
成,sof,.pof文件,以备硬件下载或编程
时用。
? 注意:编译只对顶层文件进行
时序模拟仿真
编译通过后就可进行时序模拟:
1、建立波形输入文件:
1)打开菜单 File/New,选 Waveform Editor File(.scf),OK;
2)在波形编辑器窗口的 Name下单击鼠标右键,出现浮
动菜单,选 Enter Nodes from SNF… 出现对话框;
3)在 Type 区选 Inputs和 Outputs,单击 List按钮,可在 其
右下方看到设计中的输入输出信号,单击 =>可将这些
信号选到 Selected Nodes&Groups区,OK;
4)在菜单 File中选 Save。
时序模拟仿真
2、编辑输入节点波形:
1)在菜单 Options中选中 Snap to Grid 和
Show Grid,并打开 Grid Size… 设置仿真
时间;
2)使用绘制图形工具条绘制输入节点波形;
3)选 File中 Save存盘。
时序模拟仿真
3、时序模拟:
1)在菜单 Maxplus2中选 Simulator;
2) 单击 Start,开始模拟;
3)模拟完毕,单击 Open Scf得模拟结果,
可对结果进行检查(注意有动态延时和
竞争冒险现象 )。
管脚分配
? 启动 MaxplusII/Floorplan Editor菜单,则
显示该设计项目的管脚分配;
? 用户可根据下载板情况,改变管脚分配。
注意
? 下载板有两种,
1.北京理工达胜科技有限公司生产的下
载板,芯片管脚与外围信号没有连接,需在
实验中由你连接 ;
2.东南大学东讯通生产的 DXT-BIII型 EDA
实验开发系统,芯片管脚与外围信号已连
接好,必须根据下表改变管脚分配,
图 1-2-15 PLD引脚与外部人工连接
EPF10K10LC84-4
图 1-2-16 PLD引脚与外部器件连接锁定
图 1- 2- 16 PLD管脚与外部器件连接锁定
器件名称 信号名 10K10管

器件名称 信号名 10K10管

输出发光管 L12R 25 数据开关 K2 29
输出发光管 L12G 24 数据开关 K3 30
输出发光管 L11 23 数据开关 K4 35
输出发光管 L10 22 数据开关 K5 36
输出发光管 L9 21 数据开关 K6 37
输出发光管 L8 19 数据开关 K7 38
输出发光管 L7 18 数据开关 K8 39
输出发光管 L6 65 数据开关 K9 47
输出发光管 L5 64 数据开关 K10 48
输出发光管 L4 62 数据开关 K11 49
输出发光管 L3 61 数据开关 K12 50
输出发光管 L2 60 数据开关 K13 51
输出发光管 L1G 59 数据开关 K14 52
输出发光管 L1R 58 数据开关 K15 53
数据开关 K1 28 数据开关 K16 54
器件名称 信号名 10K10管

器件名称 信号名 10K10管

数码管
M4
M4A 17 扬声器 SP 27
M4B 16 时钟信号 CP1 1
M4C 11 时钟信号 CP2 43
M4D 10
数码管
M3
M3A 9
M3B 8
M3C 7
M3D 6
数码管
M2
M2A 5
M2B 3
M2C 83
M2D 81
数码管
M1
M1A 80
M1B 79
M1C 78
M1D 73
下载
? 将实验板接口线与计算机并口连接,打
开试验箱电源;
? 启动 MaxliusII/Programmer菜单;
? 如果是第一次使用该软件,启动 Options
\Hardware Setup菜单,在 Hardware Type
中选择 ByteBlaster( MV)。
? Configure即可完成下载 。
?
注意
? 若下载后提示下载不成功信息,按以上各步
检查是否设置正确,并检查计算机与实验箱
硬件连接,排除故障,再次尝试下载;
? 随时可利用帮助信息(?),解决疑难问题;
? 相同名字的导线,在电气上相连( P26);
? 器件可以旋转;
? 一组输入或一组输出时,可用 BUS(组);
? 改变管脚后,应再编译一次,再下载。
Verilog HDL语言输入方式
? 进入 Windows操作系统,打开 MAX+Plus2;
? 启动 File\Project\Name 菜单,输入设计文件的
名称 (给出文件存储路径);
? 点击 Assign\Device菜单,选择器件
( EPM7128SLC84-6或 EPF10K10LC84-4);
? 启动 File\New菜单,选择 Text Editor file,打开
原理图编辑器;
? 键入程序;
? 在 File\Save as 保存,生成,v文件;
? 以下步骤同图形输入法。
?有关 Verilog HDL的详细内容参
见第三章 (P.98)
? /**************************************************************/
? // MODULE,adder
? // FILE NAME,add.v
? // VERSION,v1.0
? // DATE,May 5th,2003
? // AUTHOR,Peter
? // CODE TYPE,RTL
? // DESCRIPTION,An adder with two inputs (1 bit),one output (2 bits).
? /****************************************************/
? module adder (in1,in2,sum);
?
? input in1,in2;
? output [1:0] sum;
? wire in1,in2;
? reg [1:0] sum;
?
? always @ (in1 or in2)
? begin
? sum=in1+in2;
? end
? endmodule
模块名(必须和存储
时的名称相同)
端口列表
说明部分
模块
主体
结束行
注释部分
模块定义行
事件控制的
Always语句,
一直监测输入
信号,只要有
变化,就执行
下面的块语句。
Case语句
Case(敏感表达式)
值 1:块语句 1;
值 2:块语句 2;
……
default:块语句
n+1;
endcase
? module decoder(out,in);
? output[7:0] out;
? input[2:0] in;
? reg[7:0] out;
? always@(in)
? begin
? case(in)
? 3'd0:out=8'b00000001;
? 3'd1:out=8'b00000010;
? 3'd2:out=8'b00000100;
? 3'd3:out=8'b00001000;
? 3'd4:out=8'b00010000;
? 3'd5:out=8'b00100000;
? 3'd6:out=8'b01000000;
? 3'd7:out=8'b10000000;
? endcase
? end
? endmodule
<位宽 >’<基数 ><数值 >
d 十进制
h 十六进制
b 二进制
o 八进制
? module jsq16(q,clk,reset);
? output[3:0]q;
? reg [3:0]q;
? input clk,reset;
? always @(posedge clk or negedge reset)
? begin
? if(!reset) q[3:0]<=4'b0000;
? else
? q[3:0]<=q[3:0]+4'b0001;
? end
? endmodule
if(表达式) 块语句 1;
else 块语句 2;
注意
.v文件描述的功能模块可以生成一个符
号,放在用户库中,供其它原理图输入
文件调用,调用的方法与从器件库中取
元器件的方法相同。生成功能模块的方
法为:选择菜单 file\create default symbol,
经过与编译相同的过程后,生成的功能
模块被放入用户库,
实验内容和时间安排
? 星期一上午讲课,完成非门下载
先在 F盘中设置一个自己的文件夹,例,F\ lgl
? 星期一下午 ?星期二,1.2,1.3所有练习
? 星期二下午 4,00讲课:扫描显示电路
? 星期三:完成 1.4所有练习
? 星期三下午:布置数字系统设计题
? 星期四 ?星期五:完成数字系统设计一个
扫描显示
实验室 A
扫描显示电路
? 用发光管的状态验证设计是否满足要求 。
在译码器设计时, 这种方式是很直观的,
但在计数器设计时, 这样的验证方式就
显得很不直观, 尤其当计数器的位数增
加时 ( 如百进制计数 ), 太多的发光管
将使结果的读出非常困难 。
数码管驱动方式
? BCD码驱动
? 直接驱动
数码管
BCD 码驱动
输入 输出
D C B A Ya Yb Yc Yd Ye Yf Yg 字形
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
1 1 1 1 1 1 0
0 1 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 1 0 0 1
0 1 1 0 0 1 1
1 0 1 1 0 1 1
1 0 1 1 1 1 1
1 1 1 0 0 0 0
1 1 1 1 1 1 1
1 1 1 0 0 1 1
1 1 1 0 1 1 1
0 0 1 1 1 1 1
1 0 0 1 1 1 0
0 1 1 1 1 0 1
1 0 0 1 1 1 1
1 0 0 0 1 1 1
0
1
2
3
4
5
6
7
8
9
A
b
C
d
E
F
DC
BA
D
C
B
A
图 1-2-16 PLD引脚与外部器件连接锁定
东南
大学
实验
箱的
静态
显示
方式
属于
BCD
码驱
动 拨向“静态”
数码管直接驱动
输入
a b c d e f g
输出字形
1 1 1 1 1 1 0
0 1 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 1 0 0 1
0 1 1 0 0 1 1
1 0 1 1 0 1 1
1 0 1 1 1 1 1
1 1 1 0 0 0 0
1 1 1 1 1 1 1
1 1 1 1 0 1 1
1 1 1 0 1 1 1
0 0 1 1 1 1 1
1 0 0 1 1 1 0
0 1 1 1 1 0 1
1 0 0 1 1 1 1
1 0 0 0 1 1 1
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
当采用直接驱动方式时, 驱动一个数码管
需要七个电平信号, 如果系统用来显示结果
的数码管较多, 应考虑数字系统输出信号占
用 PLD芯片管脚的问题, 因为 PLD芯片的管
脚总数是有限的, 例如 F10K10,它的管脚
总数是 84,其中还有一些特定功能的管脚不
能给用户使用, 能使用的管脚不到 60个, 所
以直接驱动时, 必须设法减少占用 PLD芯片
的管脚的数量 。
解决的方法是采用动态扫描显示
动态扫描显示 (管脚见表 1-2-2)
拨向“动态”
例 1-4-1
? 设计一个电路, 使八个数码管依次同时
显示 0,1,2,…… A,B,… E,F。
例 1-4-1
动态扫

字形显







module led(a,b,c,d,e,f,g,D);
output a,b,c,d,e,f,g;
input[3:0] D;
reg a,b,c,d,e,f,g;
always
@(D)
begin
case(D)
4'd0:{a,b,c,d,e,f,g}=7'b 1111110;
4'd1:{a,b,c,d,e,f,g}=7'b 0110000;
4'd2:{a,b,c,d,e,f,g}=7'b 1101101;
4'd3:{a,b,c,d,e,f,g}=7'b 1111001;
4'd4:{a,b,c,d,e,f,g}=7'b 0110011;
4'd5:{a,b,c,d,e,f,g}=7'b 1011011;
4'd6:{a,b,c,d,e,f,g}=7'b 1011111;
4'd7:{a,b,c,d,e,f,g}=7'b 1110000;
4'd8:{a,b,c,d,e,f,g}=7'b 1111111;
4'd9:{a,b,c,d,e,f,g}=7'b 1111011;
4'hA:{a,b,c,d,e,f,g}=7'b 1110111;
4'hB:{a,b,c,d,e,f,g}=7'b 0011111;
4'hC:{a,b,c,d,e,f,g}=7'b 1001110;
4'hD:{a,b,c,d,e,f,g}=7'b 0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
endcase
end
endmodule
module decoder(out,in);
output[7:0] out;
input[2:0] in;
reg[7:0] out;
always@(in)
begin
case(in)
3'd0:out=8'b00000001;
3'd1:out=8'b00000010;
3'd2:out=8'b00000100;
3'd3:out=8'b00001000;
3'd4:out=8'b00010000;
3'd5:out=8'b00100000;
3'd6:out=8'b01000000;
3'd7:out=8'b10000000;
endcase
end
endmodule
? module saomiao(reset,clk,clk1,ms1,ms2,ms3,ms4,
? ms5,ms6,ms7,ms8,a,b,c,d,e,f,g);
? input clk,reset,clk1;
? reg [3:0] in1;
? output ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
? reg ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
? reg [3:0] temp,flag;
? always@(posedge clk)
? begin
? {ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8}=8'b00000000;
? flag=flag+1;
? case (flag)
? 0:begin temp=in1;ms1=1;end
? 1:begin temp=in1;ms2=1;end
? 2:begin temp=in1;ms3=1;end
? 3:begin temp=in1;ms4=1;end
? 4:begin temp=in1;ms5=1;end
? 5:begin temp=in1;ms6=1;end
? 6:begin temp=in1;ms7=1;end
? 7:begin temp=in1;ms8=1;end
? endcase
?case(temp)
?4'd0:{a,b,c,d,e,f,g}=7'b1111110;
?4'd1:{a,b,c,d,e,f,g}=7'b0110000;
?4'd2:{a,b,c,d,e,f,g}=7'b1101101;
?4'd3:{a,b,c,d,e,f,g}=7'b1111001;
?4'd4:{a,b,c,d,e,f,g}=7'b0110011;
?4'd5:{a,b,c,d,e,f,g}=7'b1011011;
?4'd6:{a,b,c,d,e,f,g}=7'b1011111;
?4'd7:{a,b,c,d,e,f,g}=7'b1110000;
?4'd8:{a,b,c,d,e,f,g}=7'b1111111;
?4'd9:{a,b,c,d,e,f,g}=7'b1111011;
?4'hA:{a,b,c,d,e,f,g}=7'b1110111;
?4'hB:{a,b,c,d,e,f,g}=7'b0011111;
?4'hC:{a,b,c,d,e,f,g}=7'b1001110;
?4'hD:{a,b,c,d,e,f,g}=7'b0111101;
?4'hE:{a,b,c,d,e,f,g}=7'b1001111;
?4'hF:{a,b,c,d,e,f,g}=7'b1000111;
?default:{a,b,c,d,e,f,g}=7'b1111110;
?endcase
?end
?always@(posedge clk1)
?begin if(!reset) in1=4'b0000;
? else begin in1=in1+1;
?end
?end
?endmodule







完全用 Verilog HDL完成
问题是要把两个计数器输出的个位和十位数分别显示在
不同的数码管上, 用 Sel模块实现 。
原理是,in1,in2…… in8为八个数码管的 BCD码输入端数据,
MS1有效时, in1的数据送 MS1显示;
MS2有效时, in2的数据送 MS2显示;
……
MS8有效时, in8的数据送 MS8显示 。
八组数据可以不全部都有, 如此例中, 十二进制数的低四位
送 in1,高四位送 in2,六十进制数的低四位送 in3,高四位送 in4,
其余数据端为空 。
例 1-4-2 设计一个电路,使两个数码管显示 1?12的十二进
制计数,两个数码管显示 0?59的六十进制计数。
注意:十二进制计数器自行设计
case(temp)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
4'hA:{a,b,c,d,e,f,g}=7'b1110111;
4'hB:{a,b,c,d,e,f,g}=7'b0011111;
4'hC:{a,b,c,d,e,f,g}=7'b1001110;
4'hD:{a,b,c,d,e,f,g}=7'b0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
default:{a,b,c,d,e,f,g}=7'b1111110;
endcase
end
endmodule
? module
sel(in1,in2,in3,in4,in5,in6,in7,in8,clk,ms1,ms2,ms
3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g);
? input clk;
? input [3:0] in1,in2,in3,in4,in5,in6,in7,in8;
? output
ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
? reg
ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
? reg [3:0] temp,flag;
? always@(posedge clk)
? begin
? {ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8}=8'b00000
000;
? flag=flag+1;
? case (flag)
? 0:begin temp=in1;ms1=1;end
? 1:begin temp=in2;ms2=1;end
? 2:begin temp=in3;ms3=1;end
? 3:begin temp=in4;ms4=1;end
? 4:begin temp=in5;ms5=1;end
? 5:begin temp=in6;ms6=1;end
? 6:begin temp=in7;ms7=1;end
? 7:begin temp=in8;ms8=1;end
? endcase
End
扫描显示
实验室 B
扫描显示电路
? 用发光管的状态验证设计是否满足要求 。
在译码器设计时, 这种方式是很直观的,
但在计数器设计时, 这样的验证方式就
显得很不直观, 尤其当计数器的位数增
加时 ( 如百进制计数 ), 太多的发光管
将使结果的读出非常困难 。
数码管驱动方式
? BCD码驱动
? 直接驱动
数码管
BCD 码驱动
输入 输出
D C B A Ya Yb Yc Yd Ye Yf Yg 字形
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
1 1 1 1 1 1 0
0 1 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 1 0 0 1
0 1 1 0 0 1 1
1 0 1 1 0 1 1
1 0 1 1 1 1 1
1 1 1 0 0 0 0
1 1 1 1 1 1 1
1 1 1 0 0 1 1
1 1 1 0 1 1 1
0 0 1 1 1 1 1
1 0 0 1 1 1 0
0 1 1 1 1 0 1
1 0 0 1 1 1 1
1 0 0 0 1 1 1
0
1
2
3
4
5
6
7
8
9
A
b
C
d
E
F
DC
BA
D
C
B
A
数码管直接驱动
输入
a b c d e f g
输出字形
1 1 1 1 1 1 0
0 1 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 1 0 0 1
0 1 1 0 0 1 1
1 0 1 1 0 1 1
1 0 1 1 1 1 1
1 1 1 0 0 0 0
1 1 1 1 1 1 1
1 1 1 1 0 1 1
1 1 1 0 1 1 1
0 0 1 1 1 1 1
1 0 0 1 1 1 0
0 1 1 1 1 0 1
1 0 0 1 1 1 1
1 0 0 0 1 1 1
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
当采用直接驱动方式时, 驱动一个数码管
需要七个电平信号, 如果系统用来显示结果
的数码管较多, 应考虑数字系统输出信号占
用 PLD芯片管脚的问题, 因为 PLD芯片的管
脚总数是有限的, 例如 F10K10,它的管脚
总数是 84,其中还有一些特定功能的管脚不
能给用户使用, 能使用的管脚不到 60个, 所
以直接驱动时, 必须设法减少占用 PLD芯片
的管脚的数量 。
解决的方法是采用动态扫描显示
? 北理工生产的实验箱,只能用动态扫描方式进行
数码管显示。
? 硬件电路提供了一只 3线- 8线译码器,输入端为
sel2,sel1,sel0,输出接各个数码管片选端。
3线- 8
线译码
器输入

例 1-4-1
? 设计一个电路, 使八个数码管依次同时
显示 0,1,2,…… A,B,… E,F。
D3
D2
D0
D1
D [ 3,, 0 ]
V C C6
c lk 1
I N P U T
2
L D N
A
QD
QC
QB
QA
E N T
D
C
B
RCO
C L R N
C L K
E N P
C O U N T E R
74161
8
a
b
c
d
e
f
g
D[3..0]
led
15
g
O U T P U T
14
f
O U T P U T
7
V C C
1
L D N
A
QD
QC
QB
QA
E N T
D
C
B
RCO
C L R N
C L K
E N P
C O U N T E R
74161
13
e
O U T P U T
12
d
O U T P U T
11
c
O U T P U T
10
b
O U T P U T
V C C5
r e s e t
I N P U T
V C C4
c lk
I N P U T
9
a
O U T P U T
18
s e l2
O U T P U T
17
s e l1
O U T P U T
16
s e l0
O U T P U T
3
V C C
module led(a,b,c,d,e,f,g,D);
output a,b,c,d,e,f,g;
input[3:0] D;
reg a,b,c,d,e,f,g;
always
@(D)
begin
case(D)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
4'hA:{a,b,c,d,e,f,g}=7'b1110111;
4'hB:{a,b,c,d,e,f,g}=7'b0011111;
4'hC:{a,b,c,d,e,f,g}=7'b1001110;
4'hD:{a,b,c,d,e,f,g}=7'b0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
endcase
end
endmodule
例 1-4-1
译码器







module
saomiaob(reset,clk,clk1,flag,a,b,c,d,e,f,g);
input clk,reset,clk1;
reg [3:0] in1;
output flag,a,b,c,d,e,f,g;
reg a,b,c,d,e,f,g;
reg[2:0] flag;
always@(posedge clk)
begin
flag=flag+1;
case(in1)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
4'hA:{a,b,c,d,e,f,g}=7'b1110111;
4'hB:{a,b,c,d,e,f,g}=7'b0011111;
4'hC:{a,b,c,d,e,f,g}=7'b1001110;
4'hD:{a,b,c,d,e,f,g}=7'b0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
endcase
end
always@(posedge clk1)
begin if(!reset) in1=4'b0000;
else begin in1=in1+1;
end
end
endmodule
完全用 Verilog HDL完成
问题是要把两个计数器输出的个位和十位数分别显示在
不同的数码管上, 用 Selb模块实现 。
原理是,in1,in2…… in8为八个数码管的 BCD码输入端数据,
sel[2..0]=000时, 左边数码管 ( ms1)选中, in1送 ms1;
sel[2..0]=001时, 第二数码管 ( ms2)选中, in1送 ms2;
………,
sel[2..0]=111时, 第八数码管 ( ms8)选中, in1送 ms8;
八组数据可以不全部都有, 如此例中, 十二进制数的低四位
送 in1,高四位送 in2,六十进制数的低四位送 in3,高四位送 in4,
其余数据端为空 。
例 1-4-2 设计一个电路,使两个数码管显示 1?12的十二进
制计数,两个数码管显示 0?59的六十进制计数。
注意:十二进制计数器自行设计







module
selb(in1,in2,in3,in4,in5,in6,in7,in8,clk,flag,a,b,c,d,e,f,g);
input clk;
input [3:0] in1,in2,in3,in4,in5,in6,in7,in8;
output a,b,c,d,e,f,g;
output flag;
reg a,b,c,d,e,f,g;
reg [3:0] temp;
reg [2:0] flag;
always@(posedge clk)
begin
flag=flag+1;
case (flag)
0:begin temp=in1;end
1:begin temp=in2;end
2:begin temp=in3;end
3:begin temp=in4;end
4:begin temp=in5;end
5:begin temp=in6;end
6:begin temp=in7;end
7:begin temp=in8;end
endcase
case(temp)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
/*4'hA:{a,b,c,d,e,f,g}=7'b1110111;
4'hB:{a,b,c,d,e,f,g}=7'b0011111;
4'hC:{a,b,c,d,e,f,g}=7'b1001110;
4'hD:{a,b,c,d,e,f,g}=7'b0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
*/
default:{a,b,c,d,e,f,g}=7'bzzzzzzz;
endcase
end
endmodule
End
设计要求
? 设计一个能进行时, 分, 秒计时的十二
小时制或二十四小时制的数字钟, 并具
有定时与闹钟功能, 能在设定的时间发
出闹铃音, 能非常方便地对小时, 分钟
和秒进行手动调节以校准时间, 每逢整
点, 产生报时音报时 。
设计提示
? 主控电路
? 计数器模块
? 扫描显示
主控电路 *
A,B:模式选择, AB=00为模式 0,
AB=01为模式 1,
AB=10为模式 2,闹钟设置状态 。
Turn,turn=0时, 在手动校对时,
turn=1时, 在手动校对时, 选择调整小时部分 。
Change:在手动校时或闹钟设置模式下, 每按一次, 计数器加 1。
Reset,reset=0时, 整个系统复位;
reset=1时, 系统计时或其它特殊功能操作 。
Reset1,reset1=0时, 关闭闹铃信号;
reset1=1时, 可对闹铃进行设置 。
状态显示信号 ( 发光管 ),
LD_alert:指示是否设置了闹铃功能;
LD_h:指示当前调整的是小时信号;
LD_m:指示当前调整的是分钟信号 。
设计要求
? 设计一个能进行拔河游戏的电路 。
? 电路使用 15个 (或 9个 )发光二极管表示拔河的, 电子
绳,, 开机后只有中间一个发亮, 此即拔河的中心点 。
? 游戏双方各持一个按钮, 迅速地, 不断地按动, 产生
脉冲, 谁按得快, 亮点就向谁的方向移动, 每按一次,
亮点移动一次 。
? 亮点移到任一方终端二极管时, 这一方就获胜, 此时
双方按钮均无作用, 输出保持, 只有复位后才使亮点
恢复到中心 。
? 由裁判下达比赛开始命令后, 甲乙双方才能输入信号,
否则, 输入信号无效 。
? 用数码管显示获胜者的盘数, 每次比赛结束自动给获
胜方加分 。
设计提示
? 加 /减计数器
? 译码器
? 得分计数显示电路
设计要求
设计一个可容纳四组参賽的数字式抢答器, 每组设一个
按钮供抢答使用 。 抢答器具有第一信号鉴别和锁存功能,
使除第一抢答者外的按钮不起作用;设置一个主持人
,复位, 按钮, 主持人复位后, 开始抢答, 第一信号鉴
别锁存电路得到信号后, 用指示灯显示抢答组别, 扬声
器发出2 ?3秒的音响 。
*设置犯规电路, 对提前抢答和超时答题 ( 例如 3分钟 )
的组别鸣笛示警, 并由组别显示电路显示出犯规组别 。
设置一个计分电路, 每组开始预置10分, 由主持人
记分, 答对一次加1分, 答错一次减1分 。
设计提示
? 鉴别锁存模块
? 答题计时模块
? 计分电路模块
? 扫描显示模块
? 1,此模块的关键是准确判断出第一抢答者
并将其锁存, 实现的方法可使用触发器或
锁存器, 在得到第一信号后将输入封锁,
使其它组的抢答信号无效 。
? 2,形成第一抢答信号后, 用编码, 译码及
数码显示电路显示第一抢答者的组别, 控
制扬声器发出音响, 并启动答题计时电路 。
鉴别锁存模块
洗衣机控制器
设计要求
? 设计一个洗衣机洗涤程序控制器,控制洗衣机
的电机作如下规律运转:
? 用两位数码管预置洗涤时间(分钟数),洗涤
过程在送入预置时间后开始运转,洗涤中按倒
计时方式对洗涤过程作计时显示,用 LED表示
电机的正、反转,如果定时时间到,则停机并
发出音响信号。
设计提示
? 洗涤预置时间编码模块
? 减法计数显示
? 时序电路
? 译码驱动模块
设计要求
? 1,设计一个能测量方波信号频率的频率计, 测量结果
用十进制数显示 。
? 2.测量的频率范围是 1?10KHz,分成两个频段, 即
1?999Hz,1KHz?10KHz,用三位数码管显示测量频率,
用 LED显示表示单位, 如亮绿灯表示 Hz,亮红灯表示
KHz。
3.具有自动校验和测量两种功能, 即能用标准时钟校验测
量精度 。
4.具有超量程报警功能, 在超出目前量程档的测量范围时,
发出灯光和音响信号 。
设计提示
? 脉冲信号的频率就是在单位时间内所产生的脉冲个数, 其表达式
为 f=N/T,f为被测信号的频率, N为计数器所累计的脉冲个数, T
为产生 N个脉冲所需的时间 。 所以, 在 1秒时间内计数器所记录的
结果, 就是被测信号的频率 。
? 测量 /校验选择模块 *
? 计数器模块
? 送存选择报警模块
? 锁存模块
? 扫描显示模块
测量 /校验选择模块 *
输入信号:选择信号 selet
被测信号 meas
测试信号 test
输出信号,CP1
当 selet=0时, 为测量状态, CP1=meas;
当 selet=1时, 为校验状态, CP1=test。
校验与测量共用一个电路, 只是被测信号 CP1不同而已 。
? 设置 1秒定时信号 ( 周期为 2秒 ), 在 1秒定时
时间内的所有被测信号送计数器输入端 。
? 计数器对 CP1信号进行计数, 在 1秒定时结束
后, 将计数器结果送锁存器锁存, 同时将计
数器清零, 为下一次采样测量做好准备 。
? 设置量程档控制开关 K,单位显示信号 Y,当
K=0时, 为 1?999Hz量程档, 数码管显示的数
值为被测信号频率值, Y显示绿色, 即单位为
Hz;
当 K=1时, 为 1KHz?10KHz量程档, 被测信号频
率值为数码管显示的数值乘 1000,Y显示红色,
即单位为 KHz。
? 设置超出量程档测量范围示警信号 alert。 计数
器由四级十进制计数构成 ( 带进位 C) 。 若被
测信号频率小于 1KHz( K=0), 则计数器只进
行三级十进制计数, 最大显示值为 999.Hz,如
果被测信号频率超过此范围, 示警信号驱动灯
光, 扬声器报警;若被测信号为 1KHz?10KHz
( K=1), 计数器进行四位十进制计数, 取高
三位显示, 最大显示值为 9.99KHz,如果被测
信号频率超过此范围, 报警 。
左第一位
左第一位
设计要求
? 设计一个电子密码锁, 在锁开的状态下输入密码, 密码
共 4位, 用数据开关 K1?K10分别代表数字 1,2,…, 9、
0,输入的密码用数码管显示, 最后输入的密码显示在最
右边的数码管上, 即每输入一位数, 密码在数码管上的
显示左移一位 。 可删除输入的数字, 删除的是最后输入
的数字, 每删除一位, 密码在数码管的显示右移一位,
并在左边空出的位上补充, 0”。 用一位输出电平的状态
代表锁的开闭状态 。 为保证密码锁主人能打开密码锁,
设置一个万能密码, 在主人忘记密码时使用 。
设计提示
? 密码输入删除控制模块
? 寄存模块
? 比较模块
? 扫描显示 模块
脉冲按键电话按键显示器
设计要求
设计一个具有 7位显示的电话按键显示器,
显示器应能正确反映按键数字, 显示器
显示从低位向高位前移, 逐位显示按键
数字, 最低位为当前显示位, 七位数字
输入完毕后, 电话接通, 扬声器发出
,嘟 —— 嘟, 接通声响, 直到有接听信
号输入, 若一直没有接听, 10秒钟后,
自动挂断, 显示器清除显示, 扬声器停
止, 直到有新号码输入 。
设计提示
? 号码输入显示控制模块
? 主控制模块
? 扫描显示模块
任务与要求
? 设计一个由甲, 乙双方参赛, 有裁判的 3人乒乓球游戏机 。
? 用 8个 (或更多个 )LED排成一条直线, 以中点为界, 两边各代表参
赛双方的位置, 其中一只点亮的 LED指示球的当前位置, 点亮的
LED依此从左到右, 或从右到左, 其移动的速度应能调节 。
? 当, 球, (点亮的那只 LED)运动到某方的最后一位时, 参赛者应
能果断地按下位于自己一方的按钮开关, 即表示启动球拍击球 。
若击中, 则球向相反方向移动;若未击中, 则对方得 1分 。
? 一方得分时, 电路自动响铃 3秒, 这期间发球无效, 等铃声停止后
方能继续比赛 。
? 设置自动记分电路, 甲, 乙双方各用 2位数码管进行记分显示, 每
计满 21分为 1局 。
? 甲, 乙双方各设一个发光二极管, 表示拥有发球权, 每隔 5次自动
交换发球权, 拥有发球权的一方发球才有效 。
设计思路
? 用双向移位寄存器的输出端控制 LED显示来模拟乒乓
球运动的轨迹, 先点亮位于某一方的第 1个 LED,由击
球者通过按钮输入开关信号, 实现移位方向的控制 。
? 也可用计数译码方式实现乒乓球运动轨迹的模拟, 如
利用加 /减计数器的 2个时钟信号实现甲, 乙双方的击
球, 由表示球拍的按钮产生计数时钟, 计数器的输出
状态经译码驱动 LED发亮 。
? 任何时刻都保持一个 LED发亮, 若发亮的 LED运动到
对方的终点, 但对方未能及时输入信号使其向相反方
向移动, 即失去 1分 。
? 控制电路决定整个系统的协调动作, 必须严格掌握各
信号之间的关系 。
任务与要求
? 设计一个交通信号灯控制器, 由一条主干道和一条支干道汇合成
十字路口, 在每个入口处设置红, 绿, 黄三色信号灯, 红灯亮禁
止通行, 绿灯亮允许通行, 黄灯亮则给行驶中的车辆有时间停在
禁行线外 。
? 用红, 绿, 黄发光二极管作信号灯, 用传感器或逻辑开关作检测
车辆是否到来的信号 。
? 主干道处于常允许通行的状态, 支干道有车来时才允许通行 。 主
干道亮绿灯时, 支干道亮红灯;支干道亮绿灯时, 主干道亮红灯 。
? 主, 支干道均有车时, 两者交替允许通行, 主干道每次放行 45秒,
支干道每次放行 25秒, 设立 45秒, 25秒计时, 显示电路 。
? 在每次由绿灯亮到红灯亮的转换过程中, 要亮 5秒黄灯作为过渡,
使行驶中的车辆有时间停到禁行线外, 设立 5秒计时, 显示电路 。
设计思路
? 主, 支干道用传感器检测车辆到来情况,
实验电路用逻辑开关代替 。
? 45秒, 25秒, 5秒定时信号可用顺计时,
也可用倒计时, 计时起始信号由主控电
路给出, 定时结束信号也输入到主控电
路, 由主控电路启, 闭三色信号灯或启
动另一计时电路 。
设计思路
? 主控电路是核心, 这是一个时序电路, 其输入信号为:
? (1) 车辆检测信号 ( A,B) ;
? (2) 45秒, 25秒, 5秒定时信号 ( C,D,E) 。
? 其状态表为:
? 状态 主干道 支干道 时间
? 0 绿灯亮,允许通行 红灯亮,禁止通行 45秒
? 1 黄灯亮,停车 红灯亮,禁止通行 5秒
? 2 红灯亮,禁止通行 绿灯亮,允许通行 25秒
? 3 红灯亮,禁止通行 黄灯亮,停车 5秒
具体设计
? 时钟产生电路产生 1HZ系统时钟。
? 主控电路由两个 JK触发器和逻辑门构成,其输
出经译码后,控制主干道三色灯 R,G,Y和支
干道三色灯 r,g,y。
? 三个定时器分别产生 45秒,25秒,5秒定时信
号,电路都是计数器,并受主控电路和来自主、
支干道车辆信号控制,每当计满所需时间,即
向主控电路输出“时间到”信号,并使计数器
清零。
设:
A:主干道车辆情况,有车为, 1”,无车为, 0”
B:支干道车辆情况,有车为, 1”,无车为, 0”
C,45秒定时信号,45秒定时已到为, 1”,45秒定时未到为, 0”
D,25秒定时信号,25秒定时已到为, 1”,25秒定时未到为, 0”
E,5秒定时信号,5秒定时已到为, 1”,5秒定时未到为, 0”
S0
S1
S2
S3
BAC=0
BAC=1
E=0
E=1
BAD=1
BAD=0
E=0
E=1
状态编码:
S0=00 S1=01 S2=11 S3=10
若选 JK触发器,其输出为 Q2 Q1
则状态表为:
A B C D E Q2n Q1n Q2n+1 Q1n+1
x 0 x x x 0 0 0 0
1 1 0 x x 0 0 0 0
0 1 x x x 0 0 0 1
1 1 1 x x 0 0 0 1
x x x x 0 0 1 0 1
x x x x 1 0 1 1 1
1 1 x 0 x 1 1 1 1
0 1 x x x 1 1 1 1
x 0 x x x 1 1 1 0
x x x x 0 1 0 1 0
x x x x x 1 0 0 0
维持 S0 45秒定时
由 S0—— S1
维持 S1
由 S1—— S2
维持 S2
由 S2—— S3
维持 S3
由 S3—— S0
5秒定时
25秒定时
5秒定时
从状态表得状态方程
得触发器驱动方程:
nnnnn QEQEQQQ 211212 )( ????
)]([)( 212111 DABQQCABQQQ nnnnn ??????
)(21 CABQJ n ??
)(21 DABQK n ???
nEQJ 12 ?
EQK n ?? 12
45S,25S,5S定时器 CP脉冲驱动方程
脉冲CPEQQBAQQCP ])([ 121245 ???
脉冲CPEQQBQQCP ][ 121225 ??
脉冲CPQQCP ][ 215 ??
则主控电路和各定时电路如图 1-5-3所示
计数器驱动脉冲如图 1-5-4所示
译码驱动电路真值表
译码驱动电路如图 1-5-5所示
此例也可以完全由 Verilog HDL文件完成
具有四种信号灯的交通灯控制器
? 设计一个具有四种信号灯的交通灯控制器 。 设
计要求是:由一条主干道和一条支干道汇合成
十字路口, 在每个入口处设置红, 绿, 黄, 左
拐允许四盏信号灯, 红灯亮禁止通行, 绿灯亮
允许通行, 黄灯亮则给行驶中的车辆有时间停
在禁行线外, 左拐灯亮允许车辆向左拐弯 。 信
号灯变换次序为:主支干道交替允许通行, 主
干道每次放行 40S,亮 5S红灯让行驶中的车辆
有时间停到禁行线外, 左拐放行 15秒, 亮 5S红
灯;支干道放行 30S,亮 5S黄灯, 左拐放行 15
秒, 亮 5S红灯 …… 。 各计时电路为倒计时显示 。
系统框图如图 4-7-1所示
彩灯控制器
任务与要求
? 设计一个彩灯控制器,使彩灯( LED管)
能连续发出四种以上不同的显示形式;
? 随着彩灯显示图案的变化,发出不同的
音响声。
总体设计方案
? 彩灯显示的不同形式可由不同进制计数
器驱动 LED显示完成;
? 音响由不同频率 CP脉冲驱动扬声器形成。
简易电子琴
任务与要求
? 设计一个简易电子琴;
? 利用实验箱的脉冲源产生 1,2,3,。。。
共 7个或 14个音阶信号;
? 用指示灯显示节拍;
? *能产生颤音效果;
出租车自动计费器
任务与要求
? 设计一个出租车自动计费器,具有行车
里程计费、等候时间计费、及起价三部
分,用四位数码管显示总金额,最大值
为 99。 99元;
? 行车里程单价 1元 /公里,等候时间单价 0。
5元 /10分钟,起价 3元( 3公里起价)均能
通过人工输入。
总体设计方案
? 行车里程的计费电路将汽车行驶的里程数转换
成与之成正比的脉冲数,然后由计数译码电路
转换成收费金额,实验中以一个脉冲模拟汽车
前进十米,则每 100个脉冲表示 1公里,然后用
BCD码比例乘法器将里程脉冲乘以每公里单价
的比例系数,比例系数可由开关预置。例如单
价是 1。 0元 /公里,则脉冲当量为 0。 01元 /脉冲。
? 用 LED显示行驶公里数,两个数码管显示收费
金额。
总体设计方案
? 等候时间计费需将等候时间转换成脉冲个数,
用每个脉冲表示的金额与脉冲数相乘即得计费
数,例如 100个脉冲表示 10分钟,而 10分钟收
费 0。 5元,则脉冲当量为 0。 05元 /脉冲,如果
将脉冲当量设置成与行车里程计费相同( 0。
01元 /脉冲),则 10分钟内的脉冲数应为 500个。
? 用 LED显示等候时间,两个数码管表示等候时
间收费金额。
总体设计方案
? 用加法器将几项收费相加,P=P1+P2+P3,
? P1为起价,P2为行车里程计费,P3为等
候时间计费,用两个数码管表示结果。