当前位置:文档之家› 数电实验-组合逻辑电路设计

数电实验-组合逻辑电路设计

数字逻辑电路实验实验报告学号:班级:姓名:实验3:组合逻辑电路(3)——组合逻辑电路设计一实验内容利用Quartus II实现0到9的Hamming码编码和解码电路,并在芯片中下载实现。

要求:实现对从0000到1001输入的编码和解码,并可发现并纠正传输中的单错,对双错不做要求。

在芯片中下载电路并在实验板上验证。

二实验原理2.1电路需求分析Hamming码是一套可定位码字传输中单错并纠正单错的编码体系,以4位二进制为例,其编解码和纠错原理如下:将7位二进制数的各位由低到高依次编号为1B、10B、11B、100B、……、111B。

其中为2的整数次幂的位(即1B、10B、100B)位校验位,其他四位作为数据位。

编码时,三个校验位分别与编号特定位为1的位上数字做奇偶校验(即编号位1B、11B、101B、111B的校验结果为1B位的值,10B、10B、100B、110B的校验结果为10B的值,100B、101B、110B和111B的校验结果为100B的值)。

偶校验在电路实现中更直接容易。

译码时,在仅考虑无错或单错的情形下,若三个校验位的校验结果均正确,则结果是四个数据位本身;若某位或某几位校验结果有错,可据此综合定位错误的位置:若仅1位校验结果有错,则错误出于该校验位本身;若2位校验结果有错,则该2位校验位所共同参与校验且不参与另一位校验的数据位结果有错;若三维结果均有错,则必然为111B位有错。

分析可知,编码电路可根据上述原理使用异或门实现,也可根据编码真值表由与门实现;译码电路中可使用3×4次异或运算生成校验结果,再由校验结果定位错误位后对相应位取反实现。

2.2Quartus软件从管脚分配到下载验证的过程Quartus中,在设计好电路的输入输出并选择合适的芯片型号后,可使用Pin Planner工具进行管脚分配:窗口下方有当前设计电路中所有的输入和输出节点,在Location中可选择对应节点对应的管脚。

一般要根据芯片的引脚分布和外围电路设计分配,如输入管脚应分配靠近输入设备、时钟管脚应连接振荡器等等。

分配好所有管脚后应重新执行编译。

随后,在便捷工具栏中点选Programmer,连接好要下载入的设备后选择下载方式和需要载入的电路文件,点击Start下载完成后,芯片即具有设计文件中给出的功能。

2.3实验箱介绍实验箱上的扩展板搭载了一块5M160ZE64C5芯片,拥有160个功能块和64个引脚。

为方便连接,其引脚被引出到电路板上的两组母座和一组排针处。

引脚分布如图黄色框10处为一列拨动开关,其中间端被引出到上方母座,上端引脚接入高电平,下端接地,因此通过拨动即可实现对母座处电平的控制;6处为一列LED,其负极已接地,正极被从下方母座引出,在此接入高电平即可使之亮起,故可用于观察输出电平。

三实验过程、结果及分析3.1电路实现使用V erilog分别实现编码器和译码器两个模块后,实例化两个模块于同一个顶层实体,以同时实现编解码和验证。

(1)编码电路编码器需要接受4位输入和7位输出,其中第0、1、3位为校验位,为方便使用偶校验,亦即其值为编号同位为1的其余三位的异或;其他四位为数据位,与输入一直相等即可。

实现代码如下:module hamming_coder(in,out);input [3:0] in;output[6:0] out;//Data Bits--------------------assign out[2] = in[0];assign out[4] = in[1];assign out[5] = in[2];assign out[6] = in[3];//Parity Bits-------------------assign out[0] = in[0] ^ in[1] ^ in[3];assign out[1] = in[0] ^ in[2] ^ in[3];assign out[3] = in[1] ^ in[2] ^ in[3];endmodule(2)译码电路实现译码器时,需要7位输入和4位输出,并需要三位存储校验结果。

通过校验结果的分析实现纠错功能,即对输出的某位取反。

可以使校验结果一直等于相应四位输入的异或,并利用case语句块分析校验结果并执行纠错。

module hamming_decoder(in, out, error_flag, parity_flag);input [6:0] in;output reg [3:0] out;output reg error_flag;//出现可纠正的单错时给出结果。

output[2:0] parity_flag;//用于保存三组的校验结果assign parity_flag[0] = in[0] ^ in[2] ^ in[4] ^ in[6];assign parity_flag[1] = in[1] ^ in[2] ^ in[5] ^ in[6];assign parity_flag[2] = in[3] ^ in[4] ^ in[5] ^ in[6];always@(*)begincase(parity_flag)3'b000: out = {in[6], in[5], in[4], in[2]};3'b001: out = {in[6], in[5], in[4], in[2]};//仅校验位1传输出错3'b010: out = {in[6], in[5], in[4], in[2]};//仅校验位10传输出错3'b100: out = {in[6], in[5], in[4], in[2]};//仅校验位100传输出错3'b011: out = {in[6], in[5], in[4], ~in[2]};//校验位1和10同负责的位出错3'b110: out = {in[6], ~in[5], in[4], in[2]};//10和100负责出错但1未错3'b101: out = {in[6], in[5], ~in[4], in[2]};//类推3'b111: out = {~in[6], in[5], in[4], in[2]};endcaseendendmodule(3)顶层实体在顶层实体中同时实例化一个编码器和一个译码器,编写好对应的输入输出。

编码器的输入连接到实体输入,编码器和译码器的输出均连接到实体输出,同时为了方便在硬件上验证电路功能,将编码器的输出和外部码字输入共同接入一个双路选择器,添加一个输入以控制译码器的输入来自编码器、或来自外部输入:module hamming_top(select,in,mid, code, out, code_in);input select;//为译码器选择输入,低电平选通code,高电平选通code_ininput [3:0] in;output [6:0] code;output [3:0] out;input [6:0] code_in;inout [6:0] mid;//经选择器接入code或者code_inhamming_coder coding(.in(in),.out(code));hamming_decoder decoding(.in(mid),.out(out));assign mid = select?code_in:code;endmodule3.2仿真结果图及仿真结果分析(1)编码器仿真首先设置编码器模块为顶层实体,设计编码器输入激励为0-9的二进制数,仿真结果如下:与真值表符合,结果正常无误。

(2)译码器仿真激励首先设置10组正确编码,之后再设置一次单错编码和一次双错编码,结果如图:可见译码器对单错执行了有效纠正,对双错输出了错误结果。

(3)顶层实体仿真经测试,名为“select”的选通信号仿真结果为,高电平时译码器接受外部输入,低电平时接受前级编码器输入,结果正确。

3.3管脚分配顶层实体有4+7+1个输入端,4+7个输出端,为方便连线和后续操作,将输入端尽可能分配至下方引脚,输出端尽可能分配至上方引脚,最后结果为:in信号:分配至P9~P12。

code_in信号:分配至P18~P25。

select信号:分配至P30code信号:分配至P58~P64out信号:分配至P49~P52。

分配结束后重新编译通过。

3.4下载验证将芯片通过USB线接到计算机后检测到硬件,执行下载成功。

将12个输入引脚依次序连接到拨动开关,11个输出引脚依次序接入LED阳极。

(1)将select脚输入为低电平,拨动开关改变in信号的值,可观察到out信号始终等于in信号,表明对正确传输的编解码功能正常。

(2)将select脚输入高电平,此时译码器输入=code_in。

拨动开关改变code_in 至单错情形,输出结果正确,表明选通和对单错的纠错两功能正常。

四思考题1.所设计的Hamming码能否纠一位错?能否纠两位错?为何不能纠两位错?答:可以纠一位错、不能纠两位错。

Hamming码是通过增大编码长度以增加编码信息量完成对错误位的定位和纠正的。

以4位为例,增加3个校验位只能分辨8个数字的能力,即只能定位最多1个长为8位次的错误,而码字总长为7,因此当前的Hamming码只能纠正一位错误。

2.如何设计能纠两位错的校验码?答:以4位原码为例,增加8个校验位,将8个校验位分为2组分别设计两套相互独立互不影响的错误定位规则即可发现并纠正两位错。

但这样在存储和通信中都会造成麻烦,故不是很好的解决方法。

相关主题