在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2510|回复: 1

求助:fpga实现曼彻斯特编解码仿真图

[复制链接]
发表于 2009-6-14 17:19:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我这有几段程序,能麻烦哪位大虾,帮我用MAX+plus II仿真出来吗?然后截图给我,还有整体实现的截图。
,具体分频的VHDL 的实现如下:
PROCESS(clk,clr)
BEGIN
IF(clk'EVENT AND clk='1') THEN
原始时钟
IF(clr='1'
or count2=''11'')THEN
清零
count2 < = ''00'';
ELSE
count2=count2+''01''
计数,上升沿加l
END IF ;
END IF ;
END PROCESS ;
clk1x=clk

生成clklx , clk2x
clk2x<=count2(0) ;

设计一个40 计数器来控制信号各部分的封装。其VHDL 源程序如下:
PROCESS (clk1x , clr , en)
BEGIN
IF ( clr= 'l') THEN
count40<= "000000";
清零
ELSIF ( clklx'EVENT AND clklx ='l ' ) THEN
IF (count40 = "100111") THEN
count40<="000000";
ELSIF (en ='1') THEN
count40<=count40+'l';
计数0-39
END IF ;
END IF ;
END PROCESS ;

由于要在数据的开始加入同步字头,因此在开始的3位数据会丢失,需要设计一个移位寄存器来保存由于同步字头加入的数据丢失,即将数据整体往后延时6clk1x时钟周期。其VHDL 源程序如下:
PROCESS(clk2x,d,en

—en
为编码使能信号,d为输入信号BEGIN
IF(clk2x'EVENT AND clk2x='l')THEN
—clk2x
上升沿
IF(en='l')THEN
reg3<=d;
reg2<=reg3;
regl<=reg2
—3
位移位寄存器
END IF;
din<=reg1;
END IF;
END PROCESS ;

奇校验的VHDL 源程序如下:
PROCESS (din,count40,clk2x,en


—count40
40 计数
BEGIN
IF(clk2x'EVENT AND clk2x = 'l') THEN
IF(count40>="000110"AND count40<="100101") THEN
jo<=jo XOR din



在计数6-37时,即16位数据输入时进行奇校验
ELSIF(count40>="000000"AND count40<="000101") THEN
jo<='0'


0-5时不进行校验,可用来清零,否则下次校验可能出错END IF ;
END IF ;
END PROCESS ;

编码两种方案的VHDL 源程序具体如下:
方案一:PROCESS ( clk , clr )
BEGIN
IF(clr='l')THEN
ql<='0'
ELSE
ql<= NOT(clk XOR d )
—ql
为同或编码
END IF;

END PROCESS ;
方案二:PROCESS ( clkclr)
BEGIN
IF(clk'EVENT AND clk='l') THEN
dl<=d
—dl
d,d2d的非,待二选一输入d2<= NOT d ;
END IF;
IF(clr='1') THEN
q2<='0';
ELSIF(clk='0') THEN
q2<=d2;
ELSIF(c1k='l') THEN
二选一选择器
q2<=dl ;
ENDIF ;
END PROCESS

帧封装模块的VHDL 源程序如下:
PROCESS(din,en,clr,jo,cnmd,clk2x,clklx,count40)
—din通过3位寄存器的数据
BEGIN
IF(count40>="000000"AND count40<="000010")THEN
—0-2生成同步字头前3
mo<=cnmd ;
ELSIF(count40>="000011"AND count40<="000101")THEN
—3-5生成同步字头后3
mo<=NOT cnmd ;
ELSIF(count40>="000110"AND count40<="100101")THEN
—6-37同或生成曼码
mo<=NOT(din XOR clk2x) ;
ELSIF(count40>="100110"AND count40<="100111") THEN
—38-39 异或生成奇校验曼码
mo<=(jo XOR clk2x)
如果同或则为偶校验
ELSE
mo<=' 0';
END IF ;
IF(clr='l')THEN
q<='0';
ELSIF(clklx'EVENT AND clklx='l') THEN
去毛刺
q<=mo;
END IF ;
END PROCESS ;

解码使用的计数器是基于clk2x M17 计数器。其VHDL源程序如下:
PROCESS (clk2x, clr, den)
BEGIN
IF(clr='l') THEN
清零
countl7<="00000";
ELSlF (clk2x'EVENT AND clk2x='1') THEN
—clk2x
上升沿
IF(count17<= "10000") THEN
countl7<="00000"
计数 0-1617 计数ELSIF(den='l')THEN
countl7<=countl7 +'l';
END IF ;
END IF;
END PROCESS;

检测到同步字后产生一个持续16 clk2x周期的数据输出信号sentdata VHDL 程序核心部分如下:
IF(clklx 'EVENT AND clkl='l')THEN
regl<=d;reg2<=reg1;reg3 <=reg2

—6
位移位寄存器
reg4<=reg3;reg5<=reg4;reg6<=reg5;
IF(clr='l')THEN
cd<='0';
ELSIF((regl='l'
AND
reg2='l'
AND
reg3='1')AND(reg4='0'
AND
reg5 ='0'
AND
reg6='0'))THEN
cd<='0';
ELSIF((regl='0'
AND
reg2='0'
AND
reg3='0')AND(reg4='l' AND
reg5 ='l'
AND
reg6='l'))THEN
cd<='1';

判别数据类型
END IF;
END IF;
IF(clklx'EVENT AND clklx='l')THEN
01个数
IF(clr='l' OR ctl="111" OR ct0 ="111")THEN
ctl<="000"; ct0<="000";
ELSIF(d='l')THEN
ct0<="000";
ctl<=ctl+"001";

出现l,ctl1,ct0清零
ELSIF(d='0')THEN
ctl<="000";
ct0<=ct0+"001";
出现0ct1清零,ct01
END IF;
END IF;
IF(clr='l' OR count17="10000")THEN
sc<='0';
ELSIF (ct0="010")THEN
sc<='1' ;
END IF;
IF(clr='1' OR count17="10000") THEN
sd<='0';
ELSIF(ctl="010")THEN
sd<='1'
—sc,sd
分别为ct0,ct1计数到3个的01产生的信号END IF;
IF(clr='1' OR count17="10000") THEN
den<='0';
ELSIF(sc='1' AND sd='l')THEN
—sc=1, sd=1说明出现了111000000111的数据
den<='1'                一信号den为高表示解码周期开始
ELSE
den<='0';
END IF;
IF(countl7>="00000" AND count17<="01111") THEN
sentd<='l' AND den

生成sentd 信号,后面再将其输出到sentdata
ELSE
sentd<='0';
END IF ;

如果输出为高则说明数据出错,为低则说明没有错误。具体VHDL 语句如下:
IF(clr='1')THEN
data<'0';
END IF ;
data<=NOT(clk2x XOR d)
解码
IF(countl7="10000")THEN
jo<=data
—jo
为编码的奇校验
ELSE
jo<='0';
END IF;
IF(clk2x'EVENT AND clk2x='1')THEN
IF(sentd='1')THEN
jojy<=jojy XOR d;
jojy为解码输出数据的奇校验
ELSE
jojy<='0';
END IF ;
END IF ;
IF(clr='l')THEN
f<='0'
ELSIF(count17="10000")THEN
f<=jo XOR jojy;
判断数据是否有错误
ELSE
f<='0'
END IF;
发表于 2015-7-16 23:12:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 23:24 , Processed in 0.073039 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表