[VHDL]

玩转VHDL-024 至简HDB3编码

[复制链接]
462|0
手机看帖
扫描二维码
随时随地手机跟帖
ucx|  楼主 | 2020-7-29 16:25 | 显示全部楼层 |阅读模式
HDB3编码规则如下:
①HDB3是双极性归零码。所以HDB3码需要解决连0问题,而不需考虑连1问题。
②当连0数为4个或以上时,每满4个0化作一小节,用B00V代替。其中,V的值固定为1,B=1或0由⑦决定。并记作信息码中1为I码。
③输出为三电平取值(+,0, -)。正极性时电平+表示1,负极性时电平-表示1;无论是什么极性,0始终用电平0表示。所以在讨论极性时忽略0码,只考虑1码。极性翻转指的是当前1码极性与前一个1码极性相反,此时称作常规码。当前1码若与前一个1码极性相同则称作违规码。0码可以根据需要视作常规码或违规码。
④I码是常规码,B码也是常规码
⑤V码是违规码。
⑥V码的极性同前一个V码的极性相反,即V码的极性是交替的。
⑦B=0还是B=1由同时满足⑤和⑥两个条件确定。
HDB3编码器的输入有两个:dNRZ和dClk,分别指数据和时钟。
编码器的输出是双极性,而FPGA只能输出正和0电平,不能输出负电平。所以用两条引脚qPos和qNeg来分别驱动正电平和负电平。那么模块的实体定义为
Entity HDB3_encode is port(
        dNRZ,dClk        : in std_logic;
        qPos,qNeg       : out std_logic
        );
End HDB3_encode;
为便于描述设计思路,先把完整代码呈现如下:
Architecture arc_principle of HDB3_encode is
signal reg      : std_logic_vector(0 to 4);
signal V,B,D,Vy  : std_logic;
signal polar,vPolar : std_logic;
signal B00V    :std_logic_vector(0 to 3);
signal yClk     : std_logic;
begin
Process begin wait until rising_edge(dClk);
句1:    reg <= (reg(1 to 4) or B00V) & dNRZ;
End process;
句2:    V <= '1' when reg(1 to4)="0000" else '0';
句3:    D <= reg(0);
句4:    B <= V and (vPolar xnor polar);
句5:    B00V <= B&"00"&V;
Process begin wait until rising_edge(dClk);
句6:    Vy <= V;
句7:    vPolar <= vPolar xor Vy;
句8:    polar <= polar xor D xor Vy;
End process;
句9:    yClk <= dClk after 10 ns;
句10:   qPos <= D and yClk and polar;        
句11:   qNeg <= D and yClk and not polar;
End arc_principle;
设计思路与代码解释:
信号B00V为4比特矢量,中间两个比特固定为零,首尾比特分别对应B码和V码。语句1表明reg为dNRZ移入的移位寄存器,并具有替换为B00V的功能。
句2表示V用于检测4连0。两个相邻的V码至少间隔4个周期。句6中的Vy是V的延时一个节拍信号,句7、8使用Vy而不是V需要仔细体会,后面还会对部分原因进行解释。
句3、10、11表明D是输出码流,polar是D的极性。
句9中的10ns只是用来表明yClk相对于dClk有一个固定延时,这个延时的产生办法有多种,也可以直接用dClk替代yClk。
句7中的vPolar是V的极性,V码每有效一次vPolar将翻转一次,也就是说V码的极性是严格交替的。
句4可以替换为B <=V and (vPolar xor polar);而保持电路逻辑功能不变,因为vPolar的物理意义在这两种写法中可以分别表示当前V码的输出极性或者前一V码的极性(等同于后一V码的极性)。两种写法在句8的配合下实现了,插入的V满足规则⑤但不满足规则⑥时B=1。理解句4时还要考虑在V=1时D必定为1这一条件。
句8的目的是实现polar在正确的时刻翻转,是本设计中最为费解的1句。
polar <= polar xor D xor Vy;等价于polar <= polarxor (D xor Vy);而D xor Vy 数学表示为 D⊕Vy 是 D=1且Vy=0 或 D=0且Vy=1的意思。Vy=1意味着此时的D刚好是上一时刻的B值移位所得,记作B时刻。
D=1且Vy=0代表:不在B时刻时,只要D=1则极性翻转,哪怕是V移位到D的时刻。
依据D=1且Vy=0,当插入000V时(如句1),极性发生翻转,那么在V到达D之前需要极性再翻转一次用来实现V是违规码。这个空翻正好对应D=0且Vy=1条件,即B时刻且B码为0时需要多一次空翻。
在B时刻且B=1,即Vy=1且D=1,不发生翻转,也刚好保证V码是违规码。
注:
HDB3_encode模块的句10、11用yClk而不是dClk是因为FPGA的程序中要尽量避免用时钟信号和寄存器信号产生组合逻辑。
本设计可以再引入一个高速时钟引脚,使句10和11变成时序逻辑。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ucx

28

主题

85

帖子

5

粉丝