基于FPGA 的8b10b编解码电路前端电路设计

基于FPGA 的8b10b编解码电路前端电路设计

摘 要

本设计是采用EDA技术设计的一种8B /10B 编解码电路,实现了在高速的串行数据传输中的直流平衡。该编解码电路设计大体上可以由五个模块构成,分别是默认编码模块、差异度计算模块、编码校正模块、并串转换模块、显示模块。
采用Verilog HDL 描述语言进行电路的设计、使用modelsim 10.2a 进行功能仿真、在通过Quartus II 13.1 进行FPGA逻辑综合和适配下载,并在Alter 公司的Cyclone IV E 的芯片EP4CE6F17C8 上实现并完成测试,最后用tcl语言编写约束脚本和启动文件,通过Synopsys的“Design Compiler”进行逻辑综合。
关键词: FPGA;Verilog HDL;8B10B编解码;tcl;逻辑综合。

前 言

可编程的“万能芯片” FPGA(Field-Programmable Gate Array)——现场可编程门阵列,是指一切通过软件手段更改、配置器件内部连接结构和逻辑单元,完成既定设计功能的数字集成电路。
FPGA可以实现怎样的能力,主要取决于它所提供的门电路的规模。如果门电路的规模足够大,FPGA通过编程可以实现任意芯片的逻辑功能,例如ASIC、DSP甚至PC处理器等。这就是FPGA为什么被称之为“万能芯片”的原因。
以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
FPGA的核心具有可编程灵活性高、开发周期短、并行计算可编程灵活性高等优点。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。

1总体电路结构设计

1.1 基本原理

在高速的串行数据传输中 ,传送的数据被编码 成自同步的数据流 ,就是将数据和时钟组合成单一 的信号进行传送 ,使得接收方能容易准确地将数据 和时钟分离 ,而且要达到令人满意的误码率 ,其关键 技术在于串行传输中数据的编码方法。目前大多数高速串行标准都采用 8B /10B 编码方案 ,例如光纤 通道 1、PCI - Exp ress、串行 ATA、以太网、XAU I、In2 finiBand和串行相连 SCSI等。使用 8B /10B编码技 术 ,较好地解决了以下问题。
(1)转换密度 :保证数据流中有足够的信号转 换。采用 8B /10B编码方法 ,数据流中连续的“1”或 连续的“0”不超过 5个 ,使接收端锁相环 (PLL)能正 常工作 ,避免接收端时钟漂移或同步丢失而引起数 据丢失。
(2) DC补偿 : 在高速的数据传输线路中 ,一般 采用差分信号 ,需要直流分量尽量小 ,而 8B /10B有 DC补偿功能 ,即链路中不会随着时间推移而出现 DC偏移。
(3)检错 : 8B /10B编码采用冗余方式 ,将 8位 的数据和一些特殊字符按照特定的规则编码成 10 位的数据 ,根据这些规则 ,能检测出传输过程中发生 错误的信息。
(4)特殊字符 : 8B /10B编码规定了一些特殊字符 ,可用作帧同步字符和其他的分隔符或控制字符。
8B/10B,也叫做8字节/10字节或8B10B。8B/10B方式最初由IBM公司于1983年发明并应用于ESCON(200M互连系统),由Al Widmer和Peter Franaszek在IBM的刊物“研究与开发”上描述。把 8位数据字节转换成串行传输使用的 10位码。8B /10B编码 保证了 1和 0的相对平衡组合 ,而与数据值无关 ,简 化了时钟恢复 ,降低了接收机成本。编码提供的其它位还促进了误码检测。8B /10B编码提供了构建串行通信使用的一套基础数据和控制字符。许多独立标准都以这个公共字符集为基础 ,定义更高的协议层。

1.2 电路总体图

在这里插入图片描述

1.3 电路功能框图

在这里插入图片描述
在这里插入图片描述

1.4 电路接口表

在这里插入图片描述

1.5 验证方案

为了验证编解码数据的正确性,首先在modelsim中仿真,通过观察信号的时序波形来对照真值表验证,在逻辑层面仿真成功后,再通过quartus II将各个模块烧录开发板,通过显示模块,将数据通过数码管显示出来进而进行验证数据的正确性,其中编码的数据来源于开发板上面的按键输入,解码的数据来源于编码数据的结果。
经过开发板的下载验证,通过结果分析可知,本方案符合课设设计任务书的要求,具有一定的可行性。

2模块设计

本设计按功能大体上可以分为8个子模块,分别为默认编码模块、差异度运算模块、编码校验模块、解码模块、并串转换模块、消抖模块、输入模块和显示模块。
在这里插入图片描述

2.1 默认编码模块设计

8b/10b编码是将一组连续的8位数据分解成两组数据,一组3位,一组5位,经过编码后分别成为一组4位的代码和一组6位的代码,从而组成一组10位的数据发送出去。相反,解码是将1组10位的输入数据经过变换得到8位数据位。
数据值可以统一的表示为DX.Y或KX.Y,其中D表示为数据代码,K表示为特殊的命令代码,X表示输入的原始数据的低5位EDCBA,Y 表示输入的原始数据的高3位HGF。
3B/4B 和 5B/6B 是通过映射机制进行编码的,这种映射机制已经标准化成相应的映射表
根据表格我们可以看出:5b/6b 编码的值可能有一种,还可能有两种。如果是前者,那么6b中的“1”的数量和“0” 的数量一定是相等的,如果是后者,那么编码6b的第两种情况为按位取反的结果。
在这里插入图片描述
所以,在进行编码过程中,先对5b/6b 进行默认编码,如果是第一种情况(即1的数量和0的数量相同),就在6b的最高位添加一个标记位,并且用0进行标记,否则(1的数量比0的数量多),就用1最为标记。3b/4b 默认编码过程与之相似,需要注意的是当3b=111时,有两组编码结果,为了避免10b的结果中0或1的数量连续超过4个的情况,4b码1000 和0111 这组编码出现的特殊情况外,其它的编码规则同上面分析的3B 码具有双值编码的情况,此时的编码取0001 和1110 这组编码。

2.2 差异度运算设计

8B/10B 编码中有两个重要的概念,不均等性( disparity )和极性偏差( runningdisparity , RD)。前者表示‘ 1’和‘ 0’个数的差值,其有如下规律:
(1)若 ABCDE 的 Disparity 值为 - 1, 那么在‘ RD- ’项中生成的 abcde 与 ABCDE 有一一对应的关系 , 并且 i=‘1’ , 此时除 ABCDE= ‘00011’外 abcde i 是唯一的 ;
(2)若 ABCDE 的 Disparity 值为 + 1, 那么在‘ RD-’项中生成的 abcde 与 ABCDE 有一一对应的关系 , 并且 i=‘0’, 此时除 ABCDE = ‘ 11100’外 abcdei 是唯一的 ;
(3)若 ABCDE 的 Disparity 值为 + 3, 那么在‘ RD-’项中生成的 abcde 与 ABCDE 有一一对应的关系 , 并且 i=‘0’, 此时 abcdei 是互为反码的两个值 ;
(4)若 ABCDE 的 Disparity 为其他值 , 此时 abcde i 具有互为反码的两个值 , 对这些特殊的‘RD –’项中的值可直接用查表法实现。
后者的取值分为以下三种:
(1)当码字中‘ 1’比‘ 0’多 , 或者 4B 码为 1100,或者 6B 码为 111000 时, 该码字被定义为正极性码 ,这个时候 RD 取正 ;
(2)当码字中‘ 1’比‘ 0’少 , 或者 4B 码为 0011,或者 6B 码为 000111 时, 该码字被定义为负极性码 , 这个时候 RD 取负 ;
(3)其他码字定义为中性码 , RD 取其前一码字的 RD 游程值。
在这里插入图片描述

2.3 编码校验模块设计

在3b4b默认编码模块中,编码产生的数据大致有两种情况,“0”和“1”的数量相等,或者“0”和“1”的数量不等,这两种情况和上一次数据的RD值组合产生几种结果:
为了方便判断各个状态的逻辑情况,将4b数据中1的个数多的情况标记为1,否则为0,6b数据同理。
在这里插入图片描述

2.4 解码模块设计

为得到快的解码处理速度 , 电路设计中采用数据解码并行处理完成, 而由数据 选择器控制选择输出数据的拓扑结构来实现 。8B /10B编码电路的原理是对 8B 数据编码时 将数据分为高 3位和低 5位两部分 , 分别进行 3B / 4B编码和 5B /6B编码结合在一起而生成最终的 10B数据 。 8B /10B数据解码电路 , 分为 3B /4B 解 码电路和 5B /6B解码电路两个部分, 共同实现解码 的完整数据解码。
由于解码不需要考虑差异度RD的值,从10bit 到 8bit ,所以解码的数据具有一一对应关系,可以通过4b到3b、6b到5b 直接查表来实现。可以参照附录I。
其中,需要注意的是,10bit是解码原始数据一共有2^10 1024种情况,但是与其对应的8bit的编码只有2^8 256种结果,这样如果解码的原始数据 10bit 不在编码产生的范围内,则需要解出一个错误标志信息,产生8bit 的数据为设定的默认值。
在这里插入图片描述

2.5 消抖模块设计

消抖模块主要的核心是对可能产生的按键信号进行判断是否是外部按键输 入而不是内部电平波动。一旦电平波动则开始计数,因为使用按键消抖时间为 20ms,实际消抖时间 20—40ms。 消抖只考虑的按键按下的抖动,忽略按键上弹的电平抖动,因为这段抖动不影响电路的功能和性能,如图为消抖模块内部接口波形图:
在这里插入图片描述
一旦检测到 KEY_IN 按键电平发生波动,为 0 开始计数,为 1 清除计数值,
当电平稳定为0时才能完成一次稳定计数到4000,产生消抖后的按键信号KEY。 而维持按键长时间不抬起,KEY 也一直为 0 不变。当按键 KEY_IN 抬起时,尽管 按键任然会产生电平波动,但是 KEY 信号稳定拉高为 1,这样完成一次消抖 同步到本地时钟的过程。下面列出消抖模块的端口信号表:
在这里插入图片描述

2.6 并串转换模块

由于传输中所用的是串行的数据流,所以,编码完成后需要将编号的并行10bit结果转换成串行的10bit,才能进行数据传输。
同理,在解码过程之前,也需要将串行的10bit转换成并行的以便于解码。
在这里插入图片描述
在这里插入图片描述
并行转换的数据为10bit,通过一个十进制的计数器进行控制,当计数值为0的时候,mask打开,并行数据送入移位寄存器中,并把最低位的一比特数据送出串行输出口。当计数值为非零时,mask选通前一个D触发器的输出,一个时钟上升沿,将数据向右移动移位,将数据送到串行输出端。

2.7 输入模块设计

本模块需要提供给FPGA的功能模块需要编码的8bit原始数据,这样整个系统才能运行,开发板上面可以利用的资源为四个物理按键,其中系统复位rstn占用一个,所以可以供用户自定义的按键有三个,本模块需要通过3个按键输入需要验证的8bit 并行数据。
本模块一共设计了三种工作模式,分别为计数输入模式、按键输入模式和随机模式。计数输入模式:通过按键控制输入的8bit数据逐次加一,这样可以编码出顺序的相邻数据。按键输入模式:通过两个按键控制,key1控制8bit的高4位,key2控制8bit的低4位,对key3的下降沿进行计数,即可指定输入数据的值。随机模式:通过一个key2按键进行输入,当检测到key2位低电平的时候,对计数变量cnt进行循环加一操作,计数变量cnt为8bit,最后将cnt的值通过持续赋值给输入,这样每当key2松开的时候,可以认为输入的数据为一个随机的值。

2.8 显示模块设计

本次使用的FPGA开发板上面的数码管为6个8段数码管,并且通过sel信号进行选通,drv信号输入显示编码数据。由于所有是数码管并联在一起,若想在不同的数码管上面显示不同的数据,需要分时复用数码管,首先对开发板上面的50M时钟进行分频,用分好频率的时钟进行移位和选通操作。
数值0—F分别译码成用于数码管显示的8bit显示码,分共阳和共阴的区别译码不同,需要根据不同的 FPGA 开发板来确定。八段数码管分别为 A,B,C,D,E,F,G,DP八段,前七段用于显示数字以及字母等字符,DP段在数码管上右下角,点亮后为小数点。对于多个数码管同一时刻只能点亮一个数码管。如图2.8所示:
在这里插入图片描述
由于本设计使用的FPGA开发板的数码管显示是采用的是共阳极数码管,且是六个并联的独立数码管,有6个数码管选通引脚,在这个设计中只需要四个数码管即可,现在列出共阳八段极数码管的显示码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值