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变成时序逻辑。
|