• 伪随机序列与误码检测


    思路:
    模块一:产生随机序列1作为本地码组
    模块二:产生随机序列2作为接收码组
    模块三:二输入异或门得到异或序列
    模块四:在阀门高电平期间统计异或高电平期间对CLK个数,统计误码个数
    模块五:在阀门高电平期间CLK个数
    模块六:设置阀门时间
    模块七:阀门高电平期间 误码率=误码个数/clk
     
    话不多说直接上程序,已注释。
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.std_logic_unsigned.ALL;
     
    ENTITY wsj1 IS  --定义实体wsj1
     GENERIC(n : positive := 16);
     
     PORT(CLK:IN STD_LOGIC;--时钟信号
            CTL:IN STD_LOGIC;--控制信号  
            BASIC:BUFFER STD_LOGIC;--设置伪随机序列1作为本地码组 反馈系数235(8)
          RX:BUFFER STD_LOGIC;--假设伪随机序列2作为接收码组 反馈系数203(8)
          YH:BUFFER STD_LOGIC;--异或接收码组和本地码组脉冲
          COUNTER_OUT: OUT std_logic_vector(n-1 DOWNTO 0)--记录误码个数
         );
    END wsj1;
     
    ARCHITECTURE BEHAV OF wsj1 IS
    SIGNAL C0,C1,C2,C3,C4,C5,C6,C7:STD_LOGIC;--作为本地码组的随机序列
    SIGNAL A0,A1,A2,A3,A4,A5,A6,A7:STD_LOGIC;--发送码组随机序列
    SIGNAL COUNTER_T : std_logic_vector(n-1 DOWNTO 0);--统计高电平个数
     
    BEGIN
     
    ------产生随机序列一作为本地码组(235)
     PROCESS(CLK, CTL)     --设置敏感量
      BEGIN
       IF CLK'EVENT AND CLK='1' THEN
        IF ( CTL='1') THEN
         C7<='0';C6<='0';C5<='0';C4<='0';C3<='0';C2<='0';C1<='0';C0<='1';BASIC<=C7;
        ELSE
         C1<=C0;C2<=C1; C3<=C2;C4<=C3;C5<=C4;C6<=C5;C7<=C6;
         C0<=C7 XOR C4 XOR C3 XOR C2  ;  --设置反馈方式  235(8)=1001110
         BASIC<=C7;
        END IF;
       END IF; 
     END PROCESS;
     
     ------产生随机序列二作为本地码组(203)
     PROCESS(CLK, CTL)     --设置敏感量
      BEGIN
       IF CLK'EVENT AND CLK='1' THEN
        IF ( CTL='1') THEN
         A7<='0';A6<='0';A5<='0';A4<='0';A3<='0';A2<='0';A1<='0';A0<='1';RX<=A7;
        ELSE
         A1<=A0;A2<=A1; A3<=A2;A4<=A3;A5<=A4;A6<=A5;A7<=A6;
         A0<=A7 XOR A1;  --设置反馈方式  203(8)=1000010
         RX<=A7; 
        END IF;
       END IF; 
     END PROCESS;
     
     ------二输入异或门
     PROCESS(CLK,CTL)
     BEGIN
      IF CLK'EVENT AND CLK='0' THEN
       YH<=RX xor BASIC;
      END IF;
     END PROCESS;
     
     ------在YH高电平期间对CLK进行计数,统计误码个数
     PROCESS(CLK,YH,CTL)
       BEGIN
       IF rising_edge(CLK) THEN
               IF YH='1' THEN
                  COUNTER_T <= COUNTER_T+1;
               ELSE
                  COUNTER_T <= (OTHERS => '0');
               END IF;
       END IF;
       END PROCESS;
       PROCESS(YH)
       BEGIN
       IF falling_edge(YH) THEN
         COUNTER_OUT <=COUNTER_T;
           END IF;
       END PROCESS;
    END BEHAV;
     
    testbench写法:
    信号初始化CLK和ctl都给'1'
    code excute only once:
    CTL<='0';WAIT for 600NS;
    code excute always:
    WAIT for 50NS;
    CLK<=NOT CLK;
    temp:=temp+1;
    if(temp=1024) then
    CLK<='0';   
    end if; 
    在modemsim查看波形。
     
     
    Smartkeke
  • 相关阅读:
    Android sensor 系统框架 (一)
    enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程
    Linux samba服务器配置
    为群晖加把锁:使用ssh密钥保障数据安全
    浦发银行网上银行U盾证书无法更新的解决办法
    克隆Linux系统的网卡设置
    Linux路由:CentOS6的多种玩法
    专心学LINUX:CentOS关闭屏幕自动锁定和睡眠
    群晖:关闭软路由利用双网卡桥接直连电脑上网
    Ceph之二----部署Ceph集群
  • 原文地址:https://www.cnblogs.com/smartkeke/p/6820424.html
Copyright © 2020-2023  润新知