VHDL Лучший способ генерировать PRN с переменной частотой? - PullRequest
0 голосов
/ 08 апреля 2020

Проблема следующего вопроса заключается в фиксированной точке и в том, как ее использовать в VHDL, знание GPS не является обязательным.

ENTITY BLOCK DIAGRAM

Я делаю GPS-приемник в FPGA с VHDL, и у меня проблемы с модулем генератора PRN. Прилагается здесь блок-схема. Идея состоит в том, что этот объект должен быть в состоянии адаптироваться к различным скоростям генерации каждого бита PRN.

Моя идея состояла в том, чтобы генерировать подобъект (ENABLER), который состоит из "задержки" каждого бита Генерация путем ввода в качестве Enable в под-сущности "PRN".

Пример:

We assume Fs = 8e6

Each bit must be generated every
Tchip = 1e-6/1023 = 977.5 ns

So with a period Tclock
Tclock = 1 / 8e6 = 0.000000125
Tclock / Tchip = 0.127875

Таким образом, на каждом тактовом сигнале ПЛИС делится ровно 0.127875, поэтому после 8 тактов 0.127875 * 8 = 1.023 выход объекта равен 1.

Этот 1 выход идет как вход разрешения для суб-объекта "PRN".

  1. Есть ли проблема с оставшимися 0,23 результата аккумулятора с точки зрения синхронизации GPS?
  2. Это лучший способ?

Проблема возникает, когда я пытаюсь реализовать ее с VHDL, которую я начал изучать несколько месяцев. go.

Вот код ENABLER.

Library IEEE;
Use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all; 
use ieee.FIXED_PKG.all;


Entity prn_enabler is
--generic(
--  Fs: integer:= 8000000
--  Tchip: integer: = 4198; -- Tchip * 2^32 
--);

port( 
    clk,rst,en: in std_logic;
        en_out:     out integer
);
end prn_enabler;

architecture rtl of prn_enabler is

--Local Signals
--signal Tclk        : unsigned (32 downto 0);
--signal numero2   : ufixed(10 downto -16):= 2**16 * 0.006;
--constant numero  : ufixed( downto );
--Fcodi  = integer := 1000;
--Nchips = integer := 1023;
signal Tclk      :  ufixed(31 downto 0):=  "00000000000000000000000000000000";
signal Tclk_converted    :  ufixed(31 downto 0);
signal Tchip         :  ufixed(0 downto -31):= "00000000000000000000100000110011"; --32 bit 977.5 ns approximation
signal Tchip_converted   :  ufixed(31 downto 0);
signal count         :  integer;
signal Div       :  ufixed(63 downto 0);

begin
process(clk,rst)
begin
if(rst='1') then
    --reset
elsif(clk'event and clk='1') then
    if(en = '1') then
    -- Tclk <= 1/unsigned(Fs); -- NOT ALLOWED IN UFIXED PACKAGE --this should be 0.000000125
    Tclk_converted <= Tclk sll 19;-- Tclk*2^32 or Tclk(32 downto 20) = 536
    Tchip_converted <= Tchip sll 19; -- or Tchip(32 downto 20) = 4198
    Div <= Tclk_converted*Tchip_converted;--/2^32 -- Tclk*Tchip_converted/2^32
    --Count <= Div + Div(32 downto 20); --shift 2^32 = 0.1220 ALSO ERROR WHEN +
    end if;
end if;
end process;

en_out <= Count;
end rtl;

Этот код не позволяет мне сделать деление Tclk = 1 / фс. Идея состоит в том, чтобы сдвинуть влево, чтобы удалить точку.

Tchip * 2 ^ 32 = 977.5ns * 2 ^ 32 = 4198 (low resolution)
Tclk * 2 ^ 32 = 1.25e-7 * 2 ^ 32 = 536
Solution = Tchip * Tclk / 2 ^ 32 = 0.1220

Чтобы получить точный результат, требуется минимум 54 бита, чтобы сохранить значение Tchip со всем разрешением. Так что идея состоит в том, чтобы сделать это с 64 битами.

Есть ли проблема с этим в 64-битной версии? Ответ НЕТ, используйте нужные биты, если нужно 54, используйте 54.

Эти вычисления можно увидеть в коде MATLAB. В дополнение к сравнению с 32 и 64 бит. Я прилагаю файл matlab здесь, чтобы не расширять этот вопрос.

КОД MATLAB

Заранее большое спасибо, любые вопросы или исправления будут оценены.

...