⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demod_tb.vhd

📁 qam的vhdl程序
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;

ENTITY TestDemod IS
END TestDemod;

ARCHITECTURE Bench OF TestDemod IS

  ----------------------------------------------------- UTILITY CONSTANTS ---
  constant ClkPeriod : time := 10 ns;
  constant RstPeriod : time := 50 ns;

  ------------------------------------------------------ SIZING CONSTANTS ---
  constant IF_bits       : integer := 4;
  constant baseband_bits : integer := 8;


  --------------------------------------------- DUT COMPONENT DECLARATION ---
  COMPONENT iq_demod
    GENERIC (
      IF_bits       : natural  := 4;  -- bits of IF, digitised at Clk rate
      baseband_bits : natural  := 8;  -- bit width of I/Q outputs
      -- Numerically controlled oscillator for carrier:
      -- f(carrier) = f(Clk) * carrier_incr / (2**NCO_bits)
      NCO_bits      : positive := 8;  -- bit width of NCO phase accumulator
      carrier_incr  : positive := 32; -- NCO phase increment
      -- Output lowpass filter is a crude single-pole thing, no good!
      filter_shift  : natural  := 4;  -- right shift to scale output filter
      filter_rate   : natural  := 16  -- filter multiplier is rate/2**shift
    );
    PORT (
      Clk, Rst  : in  std_logic;
      IF_signal : in  signed(IF_bits-1 downto 0);
      I, Q      : out signed(baseband_bits-1 downto 0)
    );
  END COMPONENT;

  --------------------------------------------- SIGNALS CONNECTING TO DUT ---
  SIGNAL Clk, Rst   : std_logic;
  SIGNAL IF_signal  : signed(IF_bits-1 downto 0);
  SIGNAL I, Q       : signed(baseband_bits-1 downto 0);

  ---------------------------------------------- SIGNALS DERIVED FROM DUT ---
  SIGNAL RSSI       : real;

  ---------------------------------------------- STIMULUS CONTROL SIGNALS ---
  signal StopTB     : BOOLEAN := FALSE;
  signal SrcI, SrcQ : REAL;
  signal IF_Freq    : REAL := 11.2;  -- 100 MHz * 29/256 = 11.33MHz
  signal SrcData    : Bit_vector(1 downto 0);  -- 0=>I, 1=>Q; '0'=>+, '1'=>-

BEGIN

  ------------------------------------------------------------------- DUT ---
  -- DUT instance
  --
  U1 : iq_demod
          GENERIC MAP (
            IF_bits       =>  4,
            baseband_bits =>  8,
            NCO_bits      =>  8,
            carrier_incr  =>  29,
            filter_shift  =>  2,   -- right shift to scale LP filter
      filter_rate   =>  3
          )
          PORT MAP (
            Clk       => Clk,
            Rst       => Rst,
            IF_signal => IF_signal,
            I         => I,
            Q         => Q
          );

  S_Meter : process (I, Q)
    variable rI, rQ: real;
  begin
    rI := REAL(To_Integer(I));
    rQ := REAL(To_Integer(Q));
    RSSI <= sqrt(rI*rI + rQ*rQ);
  end process;

  ------------------------------------------------------------- UTILITIES ---
  -- Reset generator
  --
  RstGen: Rst <= '1', '0' after RstPeriod;
  --
  -- Clock generator
  --
  ClkGen: process
  begin
    while not StopTB loop
      Clk <= '0', '1' after ClkPeriod/2;
      wait for ClkPeriod;
    end loop;
    wait;
  end process; -- ClkGen


  ------------------------------------------------------------- MODULATOR ---
  -- IF modulator - updates every rise of Clk,
  -- uses SrcI and SrcQ baseband stimulus signals
  -- to calculate appropriate quadrature modulated
  -- signal to apply to IF_Signal
  --
  IF_modulator: process (Clk, IF_Freq)
    -- IF phase angle, in radians
    variable Phase: real := 0.0;
    -- IF frequency, in radians per Clk cycle
    variable IF_Freq_Scale: real;
    -- Internal REAL version of signal output
    variable Real_IF: real;
    -- Scale a real frequency in MHz to real radians per clock period
    constant Freq_To_Scale: real :=
         MATH_2_PI * REAL(ClkPeriod / 1 ps) / REAL(1 us / 1 ps);
  begin
    if rising_edge(Clk) then -- Update phase and IF output
      IF_Freq_Scale := IF_Freq * Freq_To_Scale;
      Phase := (Phase + IF_Freq_Scale) MOD MATH_2_PI;
      Real_IF := SrcI * cos(Phase) + SrcQ * sin(Phase);
      IF_Signal <= to_signed(integer(Real_IF), IF_Signal'LENGTH);
    end if;
  end process; -- IF_modulator


  ----------------------------------------------- BASEBAND COMPLEX CODING ---
  -- Code a data stream into I,Q amplitudes
  --
  Baseband_Coding: process(SrcData'TRANSACTION)
    -- Previous value, to support differential coding
    -- variable Old_SrcData: bit_vector(SrcData'RANGE) := (others => '0');
  begin
    -- Noddy version:  Just code each of two bits on to sign of I, Q
    SrcI <= 4.0;
    if SrcData(0) = '1' then
      SrcI <= -4.0;
    end if;
    SrcQ <= 4.0;
    if SrcData(1) = '1' then
      SrcQ <= -4.0;
    end if;
    -- Old_SrcData := SrcData;
  end process; -- Baseband_Coding

  ------------------------------------------------- TRANSACTION GENERATOR ---

  Data_Gen : process
  begin

    for i in 1 to 10 loop
      SrcData <= "00";
      wait for 1 us;
      SrcData <= "01";
      wait for 1 us;
      SrcData <= "10";
      wait for 1 us;
      SrcData <= "11";
      wait for 1 us;
    end loop;
    -- That's All Folks
    StopTB <= true;
    wait;
  end process; -- DataGen

END Bench;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -