User Tools

Site Tools


multiplexer_numberdecoder

Tutorial 5: 七段数码管控制器, 数据选择器

七段数码管控制器

实验目的

  1. 了解七段数码管
  2. 运用译码器的原理设计数码管控制器
  3. 进一步体会组合逻辑电路的设计流程

实验原理

1. 七段数码管

如下图所示为一个七段数码管, 在生活中的运用非常广泛. 其电路结构也非常简单, 如下图所示为一个共阴极数码管的等效电路图.

2. 构造数码管控制电路

输入一个二进制值代表我们要显示的数字 (十进制为0~9, 十六进制为0~F) , 控制电路会控制各个引脚的电压, 点亮对应的二极管, 显示出我们需要显示的数字.
为了实现这个电路, 我们先给数码管的每个二极管编号, 如下图所示:

十进制显示

对于共阴极的十进制显示, 真值表如下:

Num A3 A2 A1 A0 Ya Yb Yc Yd Ye Yf Yg
0 0 0 0 0 1 1 1 1 1 1 0
1 0 0 0 1 0 1 1 0 0 0 0
2 0 0 1 0 1 1 0 1 1 0 1
3 0 0 1 1 1 1 1 1 0 0 1
4 0 1 0 0 0 1 1 0 0 1 1
5 0 1 0 1 1 0 1 1 0 1 1
6 0 1 1 0 1 0 1 1 1 1 1
7 0 1 1 1 1 1 1 0 0 0 0
8 1 0 0 0 1 1 1 1 1 1 1
9 1 0 0 1 1 1 1 0 0 1 1

其他的输入可以将对应的输出都设置成低电平.
这样可以得到下列逻辑函数:

  • Ya=A'3A'2A'0+A'3A2A1+A'3A1+A3A'2A'1
  • Yb=A'3A'2+A'3A'1A'0+A'3A1A0+A'2A'1
  • Yc=A'3A2+A'3A0+A'2A'1
  • Yd=A'3A'2A'0+A'3A'2A1+A'3A2A'1A0+A'3A1A'0+A3A'2A'1
  • Ye=A'3A1A'0+A'2A'1A'0
  • Yf=A'3A'1A'0+A'3A2A'1+A'3A2A'0+A3A'2A'1
  • Yg=A'3A'2A1+A'3A2A'1+A'3A1A'0+A3A'2A'1

但是, 数码管除了共阴极的, 还有共阳极的. 因此, 我们需要再引入一个inv输入端口, 来设置控制器是进行共阴极控制还是共阳极控制. 对应的逻辑函数为:

  • Yx,new=Yx XOR inv

x可以为a~g.

十六进制显示
Num A3 A2 A1 A0 Ya Yb Yc Yd Ye Yf Yg
0 0 0 0 0 1 1 1 1 1 1 0
1 0 0 0 1 0 1 1 0 0 0 0
2 0 0 1 0 1 1 0 1 1 0 1
3 0 0 1 1 1 1 1 1 0 0 1
4 0 1 0 0 0 1 1 0 0 1 1
5 0 1 0 1 1 0 1 1 0 1 1
6 0 1 1 0 1 0 1 1 1 1 1
7 0 1 1 1 1 1 1 0 0 0 0
8 1 0 0 0 1 1 1 1 1 1 1
9 1 0 0 1 1 1 1 0 0 1 1
A 1 0 1 0 1 1 1 0 1 1 1
b 1 0 1 1 0 0 1 1 1 1 1
C 1 1 0 0 1 0 0 1 1 1 0
d 1 1 0 1 0 1 1 1 1 0 1
E 1 1 1 0 1 0 0 1 1 1 1
F 1 1 1 1 1 0 0 0 1 1 1

实验内容

绘图法实现十进制显示

电路图如下所示:

可以看到, 尽管我们只是实现十进制显示, 但这个电路已经十分复杂了, 如果连线出了一点差错, 将会非常难以排错. 有兴趣的同学可以试着自己画一画, 体会一下这其中的艰辛m(

这里提供一份正确无误的工程文件: SevenSegmentDisplay.zip

Verilog 实现十六进制显示

代码如下:

hexDisplay.v
module hexDisplay(Ya,Yb,Yc,Yd,Ye,Yf,Yg,Dp,inv,A0,A1,A2,A3,Dp_in);
 
input A0,A1,A2,A3,inv,Dp_in;
output Ya,Yb,Yc,Yd,Ye,Yf,Yg,Dp;
reg  Ya,Yb,Yc,Yd,Ye,Yf,Yg;
 
parameter NUM00=7'b1111110;
parameter NUM01=7'b0110000;
parameter NUM02=7'b1101101;
parameter NUM03=7'b1111001;
parameter NUM04=7'b0110011;
parameter NUM05=7'b1011011;
parameter NUM06=7'b1011111;
parameter NUM07=7'b1110000;
parameter NUM08=7'b1111111;
parameter NUM09=7'b1111011;
parameter NUM0A=7'b1110111;
parameter NUM0B=7'b0011111;
parameter NUM0C=7'b1001110;
parameter NUM0D=7'b0111101;
parameter NUM0E=7'b1001111;
parameter NUM0F=7'b1000111;
 
wire[6:0] tmp;
 
	assign tmp={inv,inv,inv,inv,inv,inv,inv};
	assign Dp=Dp_in ^ inv;
 
always
	case({A3,A2,A1,A0})
		4'h0: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM00 ^ tmp;
		4'h1: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM01 ^ tmp;
		4'h2: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM02 ^ tmp;
		4'h3: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM03 ^ tmp;
		4'h4: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM04 ^ tmp;
		4'h5: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM05 ^ tmp;
		4'h6: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM06 ^ tmp;
		4'h7: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM07 ^ tmp;
		4'h8: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM08 ^ tmp;
		4'h9: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM09 ^ tmp;
		4'hA: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0A ^ tmp;
		4'hB: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0B ^ tmp;
		4'hC: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0C ^ tmp;
		4'hD: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0D ^ tmp;
		4'hE: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0E ^ tmp;
		4'hF: {Ya,Yb,Yc,Yd,Ye,Yf,Yg}=NUM0F ^ tmp;
	endcase
 
endmodule

为了方便测试, 这里再设计一个模块, 每输入一个下降沿就加1, 直到达到15, 溢出置零. 同时支持异步置零. 代码如下:

buttonCounter4bit.v
module buttonCounter4bit(A0,A1,A2,A3,rst,key_in);
 
input rst, key_in;
output A3,A2,A1,A0;
reg A3,A2,A1,A0;
 
initial {A3,A2,A1,A0}=4'b0000; 
 
always@(negedge key_in or negedge rst)
	begin
		if(rst==0)
			{A3,A2,A1,A0}=4'b0000;
		else
			{A3,A2,A1,A0} = {A3,A2,A1,A0} + 4'b0001;
	end
 
endmodule

对应的顶层设计如下:

工程文件: SevenSegmentDisplay_Verilog.zip

结果演示

数据选择器

实验目的

  • 了解数据选择器
  • 利用译码器原理设计数据选择器
  • 进一步掌握组合逻辑电路的设计流程

实验原理

1. 什么是数据选择器?

我们已经知道, 译码器的功能是将一个二进制值翻译成某一路输出的有效电平 (有效电平取决于电路的定义) . 在实际生活中, 我们还经常需要根据一个二进制值从多路输入选出我们需要的一路来. 比如视频信号切换, 现在的显示器都有多个输入信号接口, 为了在不同的接口之前切换信号, 我们需要数据选择器来实现切换的功能.

2. 数据选择器的输入输出

半导体电路的最小单元: 晶体管中我们了解到传输门这种门电路, 可以根据控制电平的不同, 让外部信号通过或截止, 实现一个电子开关的行为. 这种传输门支持通过模拟信号. 有一类数据选择器就支持从多路模拟输入根据需要挑出其中一路, 输出到输出端口. 这类数据选择器其实是译码器和传输门的结合, 只要将译码器的输出接到传输门的控制端, 传输门的输入作为模拟输入, 各个传输门的输出并到一起, 就构成了一个支持模拟信号的数据选择器. 比如下图的74HC153, 不过是用于数字信号的.

但是在Quartus中我们并不能在绘图界面的库中找到这样一个元件, 需要通过别的电路设计来实现传输门的特性. 一种办法是使用三态输出, 还有一种是采用一个或门和一个与门相组合的方式, 如下图所示: 端口1作为控制端, 端口2作为信号输入端. 如果端口1为高电平, 则该或门的输出维持为高电平, 与端口2无关, 与门的输出也不受这一路或门的影响. 如果端口1为低电平, 则该或门的输出由端口2决定, 该路信号通过了这个或门. 这样我们就实现了一个功能类似于传输门的电路.

实验内容

绘图实现

门级电路如下图所示:

工程文件: mux4.zip

Verilog实现

module MUX4(out, I0, I1, I2, I3, A0, A1);
 
input I0, I1, I2, I3, A0, A1;
output out;
reg out;
 
always
	begin
		case({A1,A0})
			2'b00: out=I0;
			2'b01: out=I1;
			2'b10: out=I2;
			2'b11: out=I3;
		endcase
	end
 
endmodule

对应的顶层设计图为:

工程文件: mux_verilog.zip

multiplexer_numberdecoder.txt · Last modified: 2019/01/07 20:22 by daizhirui