马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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位数据会丢失,需要设计一个移位寄存器来保存由于同步字头加入的数据丢失,即将数据整体往后延时6个clk1x时钟周期。其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 ( clk,clr)
BEGIN
IF(clk'EVENT AND clk='l') THEN
dl<=d;
—dl为d,d2为d的非,待二选一输入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) ELSlF (clk2x'EVENT AND clk2x='1') THEN
—clk2x 上升沿 IF(count17<= "10000") THEN countl7<="00000";
—计数 0-16即17 计数ELSIF(den='l')THEN
检测到同步字后产生一个持续16 个clk2x周期的数据输出信号sentdata 。VHDL 程序核心部分如下: IF(clklx 'EVENT AND clkl='l')THEN regl<=d;reg2<=reg1;reg3 <=reg2;
—6 位移位寄存器 reg4<=reg3;reg5<=reg4;reg6<=reg5; ELSIF((regl='l'
AND
reg2='l'
AND
reg3='1')AND(reg4='0'
AND
reg5 ='0'
AND
reg6='0'))THEN ELSIF((regl='0'
AND
reg2='0'
AND
reg3='0')AND(reg4='l' AND
reg5 ='l'
AND
reg6='l'))THEN IF(clklx'EVENT AND clklx='l')THEN
—计0,1个数 IF(clr='l' OR ctl="111" OR ct0 ="111")THEN ctl<=ctl+"001";
—出现l,ctl加1,ct0清零 ct0<=ct0+"001";
—出现0,ct1清零,ct0加1 IF(clr='l' OR count17="10000")THEN IF(clr='1' OR count17="10000") THEN sd<='1';
—sc,sd分别为ct0,ct1计数到3个的0或1产生的信号END IF; IF(clr='1' OR count17="10000") THEN ELSIF(sc='1' AND sd='l')THEN —sc=1, sd=1说明出现了111000或000111的数据 den<='1'; 一信号den为高表示解码周期开始 IF(countl7>="00000" AND count17<="01111") THEN sentd<='l' AND den;
—生成sentd 信号,后面再将其输出到sentdata
如果输出为高则说明数据出错,为低则说明没有错误。具体VHDL 语句如下:
IF(clr='1')THEN data<=NOT(clk2x XOR d);
—解码 IF(clk2x'EVENT AND clk2x='1')THEN jojy<=jojy XOR d;
—jojy为解码输出数据的奇校验 ELSIF(count17="10000")THEN f<=jo XOR jojy;
—判断数据是否有错误 |