• 伪随机序列与误码检测


    思路:
    模块一:产生随机序列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
  • 相关阅读:
    Legacy(点对线段有路走,线段向点有路走,线段树走dij)
    G. Death DBMS(查询每个主串和n个模板串匹配后val最大值,支持单点更新)
    2020 CCPC Wannafly Winter Camp Day5 J Xor on Figures(矩阵转01串,统计01串异或种类)
    zoj3988(自己集合和自己集合匹配)
    2020 CCPC Wannafly Winter Camp Day7 A(求任何子序列中相邻范围内数的个数的总和)
    hdu6241(给定树中向上向下限制求最小可能个数)
    hdu6230(求限制条件的回文个数,利用manacher+BIT求解)
    NOIP 2020 游记
    分散层叠算法学习笔记
    代理模式
  • 原文地址:https://www.cnblogs.com/smartkeke/p/6820424.html
Copyright © 2020-2023  润新知