Проблема следующего вопроса заключается в фиксированной точке и в том, как ее использовать в 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".
- Есть ли проблема с оставшимися 0,23 результата аккумулятора с точки зрения синхронизации GPS?
- Это лучший способ?
Проблема возникает, когда я пытаюсь реализовать ее с 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
Заранее большое спасибо, любые вопросы или исправления будут оценены.