您的位置:控制工程论坛网论坛 » 软件与程序 » 求助:fpga实现曼彻斯特编解码的MAX+plus II 仿真图

swallowlr

swallowlr   |   当前状态:离线

总积分:64  2024年可用积分:0

注册时间: 2009-06-14

最后登录时间: 2009-06-14

空间 发短消息加为好友

求助:fpga实现曼彻斯特编解码的MAX+plus II 仿真图

swallowlr  发表于 2009/6/14 17:44:23      1280 查看 9 回复  [上一主题]  [下一主题]

手机阅读

我这有几段程序,希望能帮我分别把每部分都用MAX+plus II 仿真出来,并且截图。还要有整体实现的截图。谢谢谢谢了,我要写论文,就差这部分了icon
1楼 0 0 回复
  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:42:27

    具体分频的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) ;

    2楼 回复本楼

    引用 swallowlr 2009/6/14 16:42:27 发表于2楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:42:56

    设计一个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楼 回复本楼

    引用 swallowlr 2009/6/14 16:42:56 发表于3楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:43:13

    由于要在数据的开始加入同步字头,因此在开始的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 ;

    4楼 回复本楼

    引用 swallowlr 2009/6/14 16:43:13 发表于4楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:43:31

    奇校验的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 ;

    5楼 回复本楼

    引用 swallowlr 2009/6/14 16:43:31 发表于5楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:44:24

    编码两种方案的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                 —dld,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;

    6楼 回复本楼

    引用 swallowlr 2009/6/14 16:44:24 发表于6楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 16:45:58

    检测到同步字后产生一个持续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;

    7楼 回复本楼

    引用 swallowlr 2009/6/14 16:45:58 发表于7楼的内容

  • jhlu3

    jhlu3   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    jhlu3   发表于 2009/6/14 17:31:37

    8楼 回复本楼

    引用 jhlu3 2009/6/14 17:31:37 发表于8楼的内容

  • jhlu3

    jhlu3   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    jhlu3   发表于 2009/6/14 17:31:58

    ico
    9楼 回复本楼

    引用 jhlu3 2009/6/14 17:31:58 发表于9楼的内容

  • swallowlr

    swallowlr   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-06-14

    最后登录时间: 2009-06-14

    空间 发短消息加为好友

    swallowlr   发表于 2009/6/14 17:44:23

    我光电子的,就是学的不好

    10楼 回复本楼

    引用 swallowlr 2009/6/14 17:44:23 发表于10楼的内容

总共 , 当前 /