• FPGA入门——basys2开发板的伪随机gold码的生成


    本文原创,转载请注明出处。

    1.gold码简介

    gold码是一种伪随机码,由两个m序列通过不同的相位抽头与或产生,具有很好的自相关与互相关特性,广泛应用于扩频通信。GPS中使用的C/A扩频码即10位寄存器长度的gold码。

    2.设计目标

    本文在basys2内部产生10位寄存器长度的gold码,通过开关控制相位抽头,并通过0.5s刷新速度的LED流水灯显示。

    3.vhdl源码

      1 library IEEE;
      2 use IEEE.STD_LOGIC_1164.ALL;
      3 use IEEE.STD_LOGIC_ARITH.ALL;
      4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
      5 
      6 entity top is
      7     port(
      8             clk        :    in        STD_LOGIC;    --系统时钟
      9             rst        :    in     STD_LOGIC;    --reset
     10             tap_1        :    in        STD_LOGIC_VECTOR ( 3 downto 0 );    --m序列相位选择,根据具体输入硬件而定
     11             tap_2        :    in        STD_LOGIC_VECTOR ( 3 downto 0 );    
     12             led        :    out    STD_LOGIC_VECTOR ( 7 downto 0 )    --led流水灯控制,根据具体输出硬件而定
     13             );
     14 end top;
     15 
     16 architecture Behavioral of top is
     17     signal    reg_1        :    STD_LOGIC_VECTOR( 9 downto 0 );    --10位循环移位寄存器
     18     signal    reg_2        :    STD_LOGIC_VECTOR( 9 downto 0 );
     19     signal    reg_gold    :    STD_LOGIC_VECTOR( 7 downto 0 );    --gold码8位缓存用于显示
     20     signal    tmp_1        :    STD_LOGIC;    --循环移位反馈信号
     21     signal    tmp_2        :    STD_LOGIC;
     22     signal    m_1        :    STD_LOGIC;    --m序列
     23     signal    m_2        :    STD_LOGIC;
     24     signal    gold        :    STD_LOGIC;    --gold序列
     25     signal    clk_sec    :    STD_LOGIC:='0';    --秒时钟
     26     signal    cnt_sec    :    INTEGER;    --用于产生秒时钟的模
     27     
     28 begin
     29 led(7 downto 0)<=reg_gold(7 downto 0);    --输出给8个Led灯
     30 
     31     --产生秒时钟clk_sec的模块
     32     process(clk,rst)
     33     begin
     34     if (rst='0') then
     35         cnt_sec<=0;
     36     elsif(clk'event and clk='1') then
     37         if(cnt_sec=12500000) then
     38             cnt_sec<=0;
     39             clk_sec<=not clk_sec;
     40         else
     41             cnt_sec<=cnt_sec+1;
     42         end if;
     43     end if;
     44     end process;    
     45 
     46     --产生m序列1
     47     process(clk_sec,rst,reg_1)
     48     begin
     49     tmp_1<=reg_1(2) xor reg_1(9);    --反馈抽头在第3、10位
     50         if (rst='0') then
     51             reg_1<=(others=>'1');
     52         elsif (clk_sec'event and clk_sec='1') then
     53             reg_1<=reg_1(8 downto 0)&tmp_1;    --循环移位
     54         end if;
     55     end process;
     56     
     57     --产生m序列2
     58     process(clk_sec,rst,reg_2)
     59     begin
     60     tmp_2<=(reg_2(1) xor reg_2(2))xor(reg_2(7) xor reg_2(9));    --反馈抽头在2、38、10位
     61         if (rst='0') then
     62             reg_2<=(others=>'1');
     63         elsif (clk_sec'event and clk_sec='1') then
     64             reg_2<=reg_2(8 downto 0)&tmp_2;    --循环移位
     65         end if;
     66     end process;    
     67     
     68     --m序列1的相位抽头选择,本部分根据具体输入硬件编程
     69     process(tap_1,reg_1)
     70     begin
     71         case tap_1 is
     72             when    b"0001"=>m_1<=reg_1(1);
     73             when    b"0010"=>m_1<=reg_1(2);
     74             when    b"0011"=>m_1<=reg_1(3);
     75             when    b"0100"=>m_1<=reg_1(4);
     76             when    b"0101"=>m_1<=reg_1(5);
     77             when    b"0110"=>m_1<=reg_1(6);
     78             when    b"0111"=>m_1<=reg_1(7);
     79             when    b"1000"=>m_1<=reg_1(8);
     80             when    b"1001"=>m_1<=reg_1(9);
     81             when    others =>m_1<=reg_1(0);
     82         end case;
     83     end process;
     84     
     85     --m序列2的相位抽头选择,本部分根据具体输入硬件编程
     86     process(tap_2,reg_2)
     87     begin
     88         case tap_2 is
     89             when    b"0001"=>m_2<=reg_2(1);
     90             when    b"0010"=>m_2<=reg_2(2);
     91             when    b"0011"=>m_2<=reg_2(3);
     92             when    b"0100"=>m_2<=reg_2(4);
     93             when    b"0101"=>m_2<=reg_2(5);
     94             when    b"0110"=>m_2<=reg_2(6);
     95             when    b"0111"=>m_2<=reg_2(7);
     96             when    b"1000"=>m_2<=reg_2(8);
     97             when    b"1001"=>m_2<=reg_2(9);
     98             when    others =>m_2<=reg_2(0);
     99         end case;
    100     end process;
    101     
    102     --gold码生成
    103     process(clk_sec,rst,m_1,m_2)
    104     begin
    105     gold<=m_1 xor m_2;
    106         if (rst='0') then
    107             reg_gold<=(others=>'0');
    108         elsif (clk_sec'event and clk_sec='1') then
    109             reg_gold<=reg_gold(6 downto 0)&gold;
    110         end if;
    111     end process;    
    112     
    113 end Behavioral;

    4.引脚定义

     1 NET    "clk"             LOC="B8";
     2 NET    "rst"             LOC="G12";
     3 NET    "tap_1<0>"        LOC="N3";
     4 NET    "tap_1<1>"        LOC="E2";
     5 NET    "tap_1<2>"        LOC="F3";
     6 NET    "tap_1<3>"        LOC="G3";
     7 NET    "tap_2<0>"        LOC="B4";
     8 NET    "tap_2<1>"        LOC="K3";
     9 NET    "tap_2<2>"        LOC="L3";
    10 NET    "tap_2<3>"        LOC="P11";
    11 NET    "led<0>"          LOC="M5";
    12 NET    "led<1>"          LOC="M11";
    13 NET    "led<2>"          LOC="P7";
    14 NET    "led<3>"          LOC="P6";
    15 NET    "led<4>"          LOC="N5";
    16 NET    "led<5>"          LOC="N4";
    17 NET    "led<6>"          LOC="P4";
    18 NET    "led<7>"          LOC="G1";
  • 相关阅读:
    查找代码中的中文
    C# 清除cookies
    C# 32位程序在64位系统下注册表操作
    C# 32位程序在64位系统下运行中解决重定向问题
    C# 把一个文件夹下所有文件删除
    C# 把一个文件夹下所有文件复制到另一个文件夹下
    chromium浏览器开发系列第五篇:Debugging with WinDBG
    chromium浏览器开发系列第四篇:如何调试最新chromium源码
    chromium浏览器开发系列第三篇:chromium源码目录结构
    chromium浏览器高级开发系列第二篇:如何编译最新chromium源码
  • 原文地址:https://www.cnblogs.com/risten/p/4166124.html
Copyright © 2020-2023  润新知