密勒码课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基带码型变换设计——密勒码码型变换1 技术要求
(1)设计密勒码的编译码电路;
(2)输入信号为24位的周期NRZ码;
(3)编译码延时小于3个码元宽度。
2 基本原理
密勒码又称延迟调制码,是双相码的一种变型。编码规则如下:“1”码用码元持续中心出现跃变来表示,即用“10”和“01”来表示,但连续的“1”之间不跳变;“0”码分两种情况来讨论:对于单个“0”的情况,在码元持续的时间内不出现电平跃变,且与相邻的码元的边界处也不跃变,对于连“0”的情况,在两个“0”码的边界出现电平跃变,即“00”和“11”交替,“0”码和“1”码之间不跳变。
图1 双相码和密勒码的波形
3 设计方案及其比较
3.1 方案一
该方案的编码部分是用vhdl语言实现的,译码部分是用电路来实现的。编码时,因为密勒码是双相码的一种变形,所以先将输入的NRZ码变换成双相码,再将双相码变成密勒码。
由基本原理的波形图可以看出,双相码的下降沿正好对应着密勒码的跃变沿。双相码的编码规则:“0”码用“01”来表示,“1”码用“10”来表示。编码部分是用D触发器电路来实现的。D触发器有延迟的作用,先将密勒码通过两个D触发器,再与DI信号相异或,将异或后的信号再通过一个D触发器就可以得到输入的NRZ码,其中编码输出就是译码的输入。
编码部分的VHDL程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity miller000_code is
port(clk:in std_logic;
nrz:in std_logic;
code_out:buffer std_logic);
end miller000_code;
architecture code of miller000_code is
signal z:std_logic;
begin
process(clk)
variable x,y:std_logic;
begin
x:=(clk and nrz);
y:=(not clk)and(not nrz);
z<=x or y;
end process;
process(z)
begin
if z'event and z='0' then
code_out<=not code_out;
end if;
end process;
end code;
图2 译码电路
图3编码的仿真波形
3.2 方案二
该方案是用数电和模电电路来实现的。在编码时先将NRZ码变成双相码,如图中的NRZ输入的那个异或门所示,NRZ跟BS信号异或之后就变成了双相码,就是图中的BPH,BPH经过一个非门和一个D触发器之后就编译成了密勒码,其中BPH作为D触发器的时钟信号,因为密勒码是由BPH的下调沿触发的。译码时,由BS和2BS作为时钟信号,密勒码作为第一个D触发器的输入信号,通过两个D触发器,再与DI信号相异或,将异或后的信号再通过一个D触发器就可以得到输入的NRZ码。图中的NRZ就是输入的非归零码,BS和2BS就是电路的时钟信号,BPH就是双相码,DI和DQ是两个中间信号,MILLER就是编码输出,DEMILLER 就是译码输出。
图4 密勒码编码和译码的电路
3.3 方案三
该方案是用VHDL语言实现的,编码部分和前两个方案其实是差不多,都是先将NRZ码变成双相码,再用双相码的下降沿触发,变成密勒码。译码部分,因为编码输出时,“0”码只有两种情况,即“11”和“00”,“1”码也只有两种情况,即“01”和“10”,所以只要将输入的信号异或就可以得到NRZ码,因为异或的规则是:相同为0,不同为1. 编码部分的程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity miller_code is
port(clk:in std_logic;
nrz:in std_logic;
code_out:buffer std_logic);
end miller_code;
architecture bhv of miller_code is
signal z:std_logic;
begin
process(clk)
variable x,y:std_logic;
begin
x:=(clk and nrz);
y:=(not clk)and(not nrz);
z<=x or y;
end process;
process(z)
begin
if z'event and z='0' then
code_out<=not code_out;
end if;
end process;
end bhv;
译码部分的程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity deco is
port(clk:in std_logic;
miller:in std_logic_vector(1 downto 0);
nrz:out std_logic);
end deco;
architecture yima of deco is
begin
process(clk)
begin
if clk'event and clk='1' then
if miller="11"or miller="00" then
nrz<='0';
else
nrz<='1';
end if;
end process;