数字电路实验报告DOC.docx
《数字电路实验报告DOC.docx》由会员分享,可在线阅读,更多相关《数字电路实验报告DOC.docx(28页珍藏版)》请在冰豆网上搜索。
数字电路实验报告DOC
实验一四位海明校验码的逻辑设计2
实验二十六进制译码计数器的设计6
实验三脉冲分频逻辑电路的设计10
实验四八位数据串入并出逻辑设计16
实验五十六位运算器的逻辑设计20
实验六4Kx8bit存储器的设计25
实验一四位海明校验码的逻辑设计
实验目的:
掌握海明校验的编码原理以及设计、调试方法,巩固提高组合逻辑知识,培养实际动手能力。
掌握总线的应用方法。
掌握总线信息出错时发现错我和纠正错我的原理,掌握奇偶校验的原理,掌握海明校验编码原理以及设计、调试方法。
实验要求:
(1)设计信息位为4位的内存的海明校验逻辑电路,在读内存储器时,具有一位出错报错和纠正一位错误的功能。
(2)为了难其正确性,在读出信息的通路上,要串入造错用逻辑,位数自定。
(3)奇偶发生器与海明校难器对同一位用一块奇偶校验集成块
实验原理:
检错和校错
由编码理论,任何一种编码是否具有检测和纠错能力,都与编码的最小距离有关,即任何两组合法代码间最少的二进制位数的差异,L-1=D+C(D>=C)L为编码的最小距离,D表示检测错误的位数;C表示纠正错误的位数。
故,8421码不具备检错能力,这是因为它的最小码距为1,当8421码的码字中有一位出错,而产生的错误代码就有可能是另一个码字,这样,无法判断它是否已出错。
8421海明校验码
8421海明校验码由8421码加三位校验码组成.设8421码为I1I2I3I4,三位校验码为:
P3P2P1,则8421码为下列七位代码:
位序
7
6
5
4
3
2
1
8421海明码
I4
I3
I2
P3
I1
P2
P1
校验码的值由下式确定:
由此可得8421海明码的最小码距为3,故D=1,C=1,可检测并纠正一位错误。
输出时在输出端先求出校验和:
然后判断S3S2S1,如果代码不出错,则S3S2S1=000,否则由S3S2S1构成的二进制数为1位指出出错位。
实验实现:
1.利用QuartusII工具,画出实验的TTl电路如下图
经过编译仿真之后,仿真波形图如下图:
如图看见,当造错数据只与原数据有一位错(1000,0100,0010,0001)时,输出的数据和输入的数据是一样的,通过海明码将错误的一位数据进行了修正。
而当没有数位错的时候,yes输出的值变为1,表明在传输过程中,数据位并没有出错。
2.海明校验码的verilog实现
Verilog代码如下
modulehaiming(num,mistake,out);
input[3:
0]num;
input[3:
0]mistake;
output[3:
0]out;
wire[2:
0]hmnum;
wire[2:
0]ckhmnum;
wire[3:
0]misnum;
wire[3:
0]erbit;
assignhmnum[0]=num[3]^num[1]^num[0],
hmnum[1]=num[3]^num[2]^num[0],
hmnum[2]=num[3]^num[2]^num[1];
assignckhmnum[0]=misnum[3]^misnum[1]^misnum[0]^hmnum[0],
ckhmnum[1]=misnum[3]^misnum[2]^misnum[0]^hmnum[1],
ckhmnum[2]=misnum[3]^misnum[2]^misnum[1]^hmnum[2];
assignmisnum[0]=num[0]^mistake[0],
misnum[1]=num[1]^mistake[1],
misnum[2]=num[2]^mistake[2],
misnum[3]=num[3]^mistake[3];
assignerbit[0]=(~ckhmnum[2])&ckhmnum[1]&ckhmnum[0],
erbit[1]=ckhmnum[2]&(~ckhmnum[1])&ckhmnum[0],
erbit[2]=ckhmnum[2]&ckhmnum[1]&(~ckhmnum[0]),
erbit[3]=ckhmnum[2]&ckhmnum[1]&ckhmnum[0];
assignout=erbit^misnum;
endmodule
这段代码,我用的assign语句,对wire类型进行赋值,因为在TTL电路之中并没有用到寄存器,而且这是一个典型的组合逻辑电路,所以并没有只用reg寄存器类型的变量。
其中的每一个赋值都和上述的TTL电路相对应。
其中num为输入的数据,mistake为造错的输入,hmnum为由输入数据所得到的的海明码,misnum为造错之后线路上的值,ckhmnum为根据海明码和数据生成的用于纠错的海明码,而erbit为根据ckhmnum所得到的哪一位错误的信息,最后根据这信息将错误的位进行改正。
下面是根据verilog编译仿真后的波形图
如图,当造错数据只与原数据有一位错(1000,0100,0010,0001)时,输出的数据和输入的数据是一样的,通过海明码将错误的一位数据进行了修正。
没有错误的时候(0000),输出数据和输入数据也是一样的。
实验小结:
这个实验让我熟悉了本实验所用的软件的使用方法,如何利用quartus软件,画电路图,并且编译仿真,以及利用verilogHDL编写简单的组合逻辑电路,以及利用quartus软件对编写的verilog程序进行编译,仿真,以及基本的数字电路设计调试方法,本实验让我受益匪浅。
实验二十六进制译码计数器的设计
实验目的:
1.掌握设计组合逻辑电路的方法
2.不同器件,不同设计方法的比较
3掌握数码显示与译码器电位间的关系,掌握小规模可编程芯片的应用,掌握GAL方程的设计
实验要求:
用GAL方程设计方法进行实验,并用MAX+PLUAS进行原理图形设计并仿真验证
实验器件:
计算机及相关软件,实验教学板,GAL16V8芯片,插线等
实验原理:
GfVCCab
12345
a
f
a
b
c
d
e
f
g
a
b
c
d
e
f
g
A
b
c
h.
d
e
e
e
g
678910
10h
hh
edVCCch
七段发光二极管管脚说明共阴型共阳型
由七段管的管脚图可以列出真值表
输入信号
七段数码管管脚信号
A
B
C
D
数码
a
b
c
d
e
f
g
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
1
1
0
1
1
0
0
0
0
0
0
1
0
2
1
1
0
1
1
0
1
0
0
1
1
3
1
1
1
1
0
0
1
0
1
0
0
4
0
1
1
0
0
1
1
0
1
0
1
5
1
0
1
1
0
1
1
0
1
1
0
6
1
0
1
1
1
1
1
0
1
1
1
7
1
1
1
0
0
0
0
1
0
0
0
8
1
1
1
1
1
1
1
1
0
0
1
9
1
1
1
1
0
1
1
1
0
1
0
A
1
1
1
0
1
1
1
1
0
1
1
B
0
0
1
1
1
1
1
1
1
0
0
C
0
0
0
1
1
0
1
1
1
0
1
D
0
1
1
1
1
0
1
1
1
1
0
E
1
0
0
1
1
1
1
1
1
1
1
F
1
0
0
0
1
1
1
由上述真值表可以得到表达式
a=~(~A&~B&~C&D|~A&B&~C&~D|A&~B&C&D|A&B&~C&~D|A&B&~C&D)
b=~(~A&B&~C&D|~A&B&C&~D|A&~B&C&D|A&B&~C&~D|A&B&C&~D|A&B&C&D)
c=~(~A&~B&C&~D|A&B&~C&~D|A&B&C&~D|A&B&C&D)
d=~(~A&~B&~C&D|~A&B&~C&~D|~A&B&C&D|A&~B&C&~D|A&B&C&D)
e=~(~A&~B&~C&D|~A&~B&C&D|~A&B&~C&~D|~A&B&~C&D|~A&B&C&D|A&~B&~C&D)
f=~(~A&~B&~C&D|~A&~B&C&~D|~A&~B&C&D|~A&B&C&D|A&B&~C&~D|A&B&~C&D)
g=~(~A&~B&~C&~D|~A&~B&~C&D|~A&B&C&D)
由此表达式即可得到对应的数码显示
实现方法:
(1)GAL芯片
PLD16V8
BASICDECODE
CYB2013.10.20
SHIYANUSTCV1.0
ABCDNCNCNCNCNCGND
NCNCg0f0e0d0c0b0a0VCC
/a0=/A*/B*/C*D+/A*B*/C*/D+A*/B*C*D+A*B*/C*/D+A*B*/C*D
/b0=/A*B*/C*D+/A*B*C*/D+A*/B*C*D+A*B*/C*/D+A*B*C*/D+A*B*C*D
/c0=/A*/B*C*/D+A*B*/C*/D+A*B*C*/D+A*B*C*D
/d0=/A*/B*/C*D+/A*B*/C*/D+/A*B*C*D+A*/B*C*/D+A*B*C*D
/e0=/A*/B*/C*D+/A*/B*C*D+/A*B*/C*/D+/A*B*/C*D+/A*B*C*D+A*/B*/C*D
/f0=/A*/B*/C*D+/A*/B*C*/D+/A*/B*C*D+/A*B*C*D+A*B*/C*/D+A*B*/C*D
/g0=/A*/B*/C*/D+/A*/B*/C*D+/A*B*C*D
DESCRIPTION
Ps:
具体的效果在实验的那一天已经由助教检查通过。
(2)利用verilog进行描述
moduleyima(clk,out,count);
inputclk;
outputreg[6:
0]out;
outputreg[3:
0]count;
always@(posedgeclk)
begin
count<=count+1;
end
always@(count)
case(count)
4'd0:
out<=7'b1000000;
4'd1:
out<=7'b1111001;
4'd2:
out<=7'b0100100;
4'd3:
out<=7'b0110000;
4'd4:
out<=7'b0011001;
4'd5:
out<=7'b0010010;
4'd6:
out<=7'b0000010;
4'd7:
out<=7'b1111000;
4'd8:
out<=7'b0000000;
4'd9:
out<=7'b0010000;
4'd10:
out<=7'b0001000;
4'd11:
out<=7'b0000011;
4'd12:
out<=7'b1000110;
4'd13:
out<=7'b0100001;
4'd14:
out<=7'b0000110;
4'd15:
out<=7'b0001110;
default:
out<=8'b110000000;
endcase
endmodule
这个verilog描述其实是将计数和译码部分写到了一起,第一个always块的作用就是计数,每当一个时钟上升沿来临的时候,就将count加1,,而第二个always块的作用则是译码操作,即是一个显示译码器,将count的4为二进制码译成控制数码管的7位二进制码。
注意数码管是低电平有效的。
Ps:
实验室所用的板子自带显示译码的功能,所以译码的always快可以去掉,具体的开发板实现已经给老师验收。
下面是编译仿真之后的波形图
分析仿真结果,计数器随着时钟而不断加1,out为控制7段数码管的7位二进制数。
实验小结:
本次试验利用GAL芯片进行编程,让我接触了一下小规模的逻辑电路的设计实现方法,而且这也是我们第一次接触到现实中的芯片去完成一个计数显示的功能,十分有意思。
而且这个实验在让我们熟悉了利用卡诺图进行化简以及时序逻辑电路的基本设计方法。
实验三脉冲分频逻辑电路的设计
实验目的:
掌握同步时序电路和分频,延迟整形的原理和设计方法,进一步提高实践能力。
实现下图的分频整形设计
实验原理:
可参考下图原理图
延迟
整形电路
整形电路
L17L15L16CP1CP2CP3CP4CP5CP6
L9L10L11L12L13L14
CP
L1L2L3L4L5L6L7L8
CLK
10MHZ
时序脉冲分频,分配,延迟与整形框图(Ln=灯n)
首先要实现一个5分频。
即一个五周期的循环。
可以通过3个D触发器来实现该功能。
五周期真值表如下:
Q1
Q2
Q3
0
0
0
1
0
0
0
1
0
1
1
0
0
0
1
输出Q3。
则利用时序逻辑电路的设计方法,通过卡诺图化简得到方程:
Q1n=~Q1n-1&~Q3n-1
Q2n=~Q1n-1^~Q2n-1
Q3n=Q1n-1&Q2n-1
四分频或二分频可直接通过计数器得到。
实现一个移位型三周期计数器,利用D触发器设计。
真值表如下
起始Q1Q2Q3=000
Q1
Q2
Q3
1
0
0
0
1
0
0
0
1
分别输出三个结果。
同样的,利用时序逻辑电路的设计方法,化简得到方程:
Q1n=~Q1n-1&~Q2n-1
Q2n=Q1n
Q3n=Q2n
而最后CP1~CP6课通过上面得到的不同周期的分频,通过一个组合逻辑得到,观察图像,得到方程:
cp[1]=q4b&q5&q6,
cp[2]=q4b&~q5&q6,
cp[3]=q4b&q5&q7,
cp[4]=q4b&~q5&q7,
cp[5]=q4b&q5&q8,
cp[6]=q4b&~q5&q8;
实验实现:
1.利用QuartusII工具,画出实验的TTl电路如下图
经过编译仿真之后,仿真波形图如下图:
如上图所见,仿真之后的波形图和我们的目的的波形图除了排版之外,并没有不同。
本实验的TTL电路是一个异步逻辑电路,并不是所有的时钟都接在同一个时钟的上面,其实这样的做法是有一定的坏处的,在同步性方面会有一定的欠缺,但是当时做实验的时候对这方面的了解并不多,所以采用的异步的方式来实现的电路
2.利用verilog进行描述
modulefenpin(clk,q3,q4,q4b,q5,q6,q7,q8,cp);
inputclk;
outputregq3,q4,q4b,q5,q6,q7,q8;
outputwire[6:
1]cp;
integeri,j;
always@(posedgeclk)
begin
if(i==3)
q3<=1;
if(i==4)
begin
q3<=0;
i=0;
end
i=i+1;
end
always@(posedgeq3)
begin
q4<=~q4;
q4b<=q4;
end
always@(posedgeq4)
begin
q5<=~q5;
end
always@(posedgeq5)
begin
j=j+1;
case(j)
1:
begin
q6<=1;q7<=0;q8<=0;
end
2:
begin
q6<=0;q7<=1;q8<=0;
end
3:
begin
q6<=0;q7<=0;q8<=1;j=0;
end
defaultj=0;
endcase
end
assign
cp[1]=q4b&q5&q6,
cp[2]=q4b&~q5&q6,
cp[3]=q4b&q5&q7,
cp[4]=q4b&~q5&q7,
cp[5]=q4b&q5&q8,
cp[6]=q4b&~q5&q8;
endmodule
下面是根据verilog编译仿真后的波形图
分析仿真波形图可见,与我们所期望的波形图相同。
同上,使用verilog的时候,采用的是异步逻辑电路。
实验小结:
本实验是第一次对时序逻辑电路的设计实验,进行的是一个简单的分频的实验,这个实验利用到了手动设计5分频,和利用计数器实现分频,以及移位计数的设计。
通过本次试验,我们对时序逻辑电路有了更加深刻的认识,而且在实验的过程之中我们会遇到一些问题,比如有一些毛刺,通过不断地调试消除毛刺的过程,我们对时序逻辑电路延迟的问题有了更深刻的认识,而且对如何对它进行调试也有了一个基础的概念。
通过编写这个实验的verilog,我们知道了如何利用verilog实现时序逻辑电路。
实验四八位数据串入并出逻辑设计
实验目的:
从一个八位起始码开始,串行读入数据,每读入八位一次性并行输出,读到八位终止码结束。
进一步掌握同步时序电路及其在计算机中的应用,提高灵活应用,以及分析、设计、调试能力。
实验原理:
这次实验中的描述语言的起始码为01100110,终止码为10011001。
原理图的起始码为10011001,终止码为01100110.
原理图设计时,输入接入74164移位寄存器,每个时钟节拍将读入一位数据并将之前读到的数据进行移位,那么74164输出即为当前并行的八位数据,将该八位数判断,当满足触发起始条件时,将触发jk触发器,启动计数器74161,产生一个八倍与时钟的周期,连接至74273片,每次计数器时钟一个节拍输出一次,相当于每八位串行数据输出一次。
当读入终止码时,触发jk触发器,关闭计数器,即不在触发74273输出。
描述语言设计时则相对简单,我们采用一个八位寄存器来保存输入数据,当读到起始码时进行判断,并将判断寄存器置1,计数寄存器置0并开始计数,每计数八次将寄存器中的存值输出。
读到终止码时,将判断寄存器置0,不再输出。
实验实现:
1.利用QuartusII工具,画出实验的TTl电路如下图
经过编译仿真之后,仿真波形图如下图:
分析波形图可知,当输入依次为10011001时,开始计数,然后再8个周期之后,即下一个八位数据进入之时,将此时输入的8位数据并行输出。
由图像可知,将后面的两个8位数据依次输出,没有出现错误,当依次输入01100110的时候,停止并行输出,并且输出为零。
2.verilog实现
modulecrbc(numin,numout,clk);
inputnumin,clk;
outputreg[7:
0]numout;
reg[7:
0]num;
reg[3:
0]j;
regstate;
always@(posedgeclk)
begin
num=(num<<1)+numin;
if(num==8'b01100110)
begin
state=1;
j=0;
end
if(num==8'b10011001)
begin
state=0;
numout=0;
j=0;
end
if(j==8&&state==1)
begin
numout<=num;
j=0;
end
j=j+1;
end
endmodule
代码就是比较简单的verilog代码,每一次输入一个数据,就将8位的寄存器左移一位,然后加上新输入的一位,检测是否符合开启并行输出的条件,然后计数8个周期,输出输入的串行数据。
编译仿真之后的波形图
同上面TTL电路图的波形图,当输入为01100110的时候,开启并行输出,开始计数,8个周期之后输出串行数据,连续并行输出两个8位串行数据并没有出现错误。
实验小结:
本实验是设计8位串入并出,实验并不困难,但是加深了我们对时序逻辑电路的理解,以及数据在计算机中传播的认识。
实验五十六位运算器的逻辑设计
实验目的:
1·掌握算术了逻辑部件74181和提前进位发生器74182等集成块的结构原理和应用。
2·熟悉运算器基本组成的控制方法,以及不同的结构进位速度情况。
实验内容:
1.用74181,74182等集成块和数字逻辑实验仪组成16位可控运算器。
2.控制不同运算方式,并列表记录运算结果
3.设计一个选择,分别利用超前进位和不利用超前进位进行加法运算,并比较所用时间的差。
实验原理:
ALU功能表,74181
串行计算:
直接使用74181,将进位串联起来就可以
并行计算:
加上74182超前进位。
超前进位推导
4位之间采用先行进位公式,每一位的进位公式可递推如下:
第0位向第1位的进位公式为
Cn+1=Y0+X0Cn
其中Cn是向第0位(末位)的进位。
第1位向第2位的进位公式为
Cn+2=Y1+X1Cn+1=Y1+Y0X1+X0X1Cn
第2位向第3位的进位公式为
Cn+3=Y2+X2Cn+2=Y2+Y1X1+Y0X1X2+X0X1X2Cn
第3位的进位输出(即整个4位运算进位输出)公式为
Cn+4=Y3+X3Cn+3=Y3+Y2X3+Y1X2X3+Y0X1X2X3+X0X1X2X3Cn
利用四片74181构成16位的ALU,然后利用74182实现超前进位,并且利用数据选择器74157进行超前进位与非超前进位间的选择。
实验实现:
1.利用QuartusII工具,画出实验的TTl电路如下图
经过编译仿真之后,仿真波形图如下图:
如图,输入a和b分别为16进制的1234和2222是,sel从0开始计数,则输出如下,与实验时老师给我们的标准相同。
2.利用verilog进行描述
Verilog只描述