Перейти к содержанию

    

ZED

Свой
  • Публикаций

    264
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о ZED

  • Звание
    Местный

Информация

  • Город
    Москва
  1. Я, честно говоря, не особо понимаю как время-импульсное кодироваие может быть применено в радиолокации, ведь по времени между излученным и отраженным импульсом оределяется расстояние до цели. А если это время меняется хоть по определенному закону непонятно на какую дальность рассчитывать (нацеливаться). Поэтому и используют равное расстояние между импульсами, да и импульсы одинаковой длины. Единственное где могло бы найти применение время-импульсное кодирование, - это в радиолокации с активным ответом.
  2. Вот решил написать свой вариант FIFO-буфера, правда я его в кристалле не тестировал. Прошу покритиковать. CODElibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity FIFO is generic (Addr_Size : natural := 3; -- Разрядность адреса (глубина FIFO) Data_Size : natural := 32); -- Разрядность данных port (RST : in std_logic; -- Сброс CLK_WR : in std_logic; -- Тактовый сигнал для записи WE : in std_logic; -- Разрешение записи (Write Enable) Data_WR : in std_logic_vector(Data_Size - 1 downto 0); -- Данные, записываемые в буфер CLK_RD : in std_logic; -- Тактовый сигнал для чтения RE : in std_logic; -- Разрешение чтения (Read Enable) Data_RD : out std_logic_vector(Data_Size - 1 downto 0); -- Данные, читаемые из буфера Full : out std_logic; -- Флаг того, что буфер полон Empty : out std_logic); -- Флаг того, что буфер пуст end entity FIFO; architecture RTL of FIFO is type FIFO_RAM_Type is array (0 to 2**Addr_Size - 1) of std_logic_vector(Data_Size - 1 downto 0); signal FIFO_RAM : FIFO_RAM_Type; --================================================================================ ================================================-- -- Функция преобразования из двоичного кода в код Грея: -- --================================================================================ ================================================-- function Bin_to_Gray (D: unsigned) return unsigned is variable Q : unsigned(D'range); begin Q := ('0' & D(D'high downto 1)) xor D; return Q; end function Bin_to_Gray; --================================================================================ ================================================-- --================================================================================ ================================================-- -- Функция преобразования кода Грея в двоичный код: -- --================================================================================ ================================================-- function Gray_to_Bin (D: in unsigned) return unsigned is variable Q: unsigned(D'high downto D'low); begin Q(D'high) := D(D'high); for i in D'high - 1 downto D'low loop Q(i) := D(i) xor Q(i + 1); end loop; return Q; end function; --================================================================================ ================================================-- signal Addr_Write_Gray : unsigned(Addr_Size downto 0); -- Адрес записи данных в буфер в коде Грея signal Addr_Write_Gray_Next : unsigned(Addr_Size downto 0); -- Следующий адрес записи данных в буфер в коде Грея signal Addr_Read_Gray : unsigned(Addr_Size downto 0); -- Адрес чтения данных из буфера в коде Грея signal Addr_Write_Bin : unsigned(Addr_Size downto 0); -- Адрес записи данных в буфер в двоичном коде signal Addr_Write_Bin_Next : unsigned(Addr_Size downto 0); -- Следующий адрес записи данных в буфер в двоичном коде signal Addr_Read_Bin : unsigned(Addr_Size downto 0); -- Адрес чтения данных из буфера в двоичном коде signal WE_Allow : std_logic; -- Разрешение записи данных в FIFO-буфер signal RE_Allow : std_logic; -- Разрешение чтения данных из FIFO-буфера signal Full_Match : std_logic; -- Сравнение адресов записи и чтения для флага того, что буфер полон signal Empty_Match : std_logic; -- Сравнение адресов записи и чтения для флага того, что буфер пуст begin -- Адрес записи данных в буфер в двоичном коде: -- process(RST, CLK_WR) begin if (RST = '1') then Addr_Write_Bin <= (others => '0'); elsif (Rising_Edge(CLK_WR)) then if(WE_Allow = '1') then Addr_Write_Bin <= Addr_Write_Bin + 1; end if; end if; end process; -- Следующий адрес записи данных в буфер в двоичном коде: -- process(RST, CLK_WR) begin if (RST = '1') then Addr_Write_Bin_Next <= TO_UNSIGNED(1, Addr_Size + 1); elsif (Rising_Edge(CLK_WR)) then if(WE_Allow = '1') then Addr_Write_Bin_Next <= Addr_Write_Bin_Next + 1; end if; end if; end process; -- Адрес записи данных в FIFO-буфер в коде Грея: -- Addr_Write_Gray <= Bin_to_Gray(Addr_Write_Bin); -- Следующий адрес записи данных в буфер в коде Грея: -- Addr_Write_Gray_Next <= Bin_to_Gray(Addr_Write_Bin_Next); -- Адрес чтения данных из буфера в двоичном коде: -- process(RST, CLK_RD) begin if (RST = '1') then Addr_Read_Bin <= (others => '0'); elsif (Rising_Edge(CLK_RD)) then if(RE_Allow = '1') then Addr_Read_Bin <= Addr_Read_Bin + 1; end if; end if; end process; -- Адрес чтения данных из FIFO-буфера: -- Addr_Read_Gray <= Bin_to_Gray(Addr_Read_Bin); -- Запись данных в FIFO-буфер: -- process begin wait until (rising_edge(CLK_WR)); if(WE_Allow = '1') then FIFO_RAM(TO_INTEGER(Addr_Write_Gray(Addr_Size - 1 downto 0))) <= Data_WR; end if; end process; -- Чтение данных из FIFO-буфера: -- process begin wait until (rising_edge(CLK_RD)); if(RE_Allow = '1') then Data_RD <= FIFO_RAM(TO_INTEGER(Addr_Read_Gray(Addr_Size - 1 downto 0))); end if; end process; -- Разрешение записи данных в FIFO-буфер: -- WE_Allow <= '1' when (WE = '1' and Full_Match = '0') else '0'; -- Разрешение чтения данных из FIFO-буфера: -- RE_Allow <= '1' when (RE = '1' and Empty_Match = '0') else '0'; -- Сравнение адресов записи и чтения для флага того, что буфер полон: -- Full_Match <= '1' when (Addr_Write_Bin(Addr_Size - 1 downto 0) = Addr_Read_Bin(Addr_Size - 1 downto 0) and Addr_Write_Bin(Addr_Size) /= Addr_Read_Bin(Addr_Size) and (RE = '0' or (RE = '1' and WE = '1'))) else '0'; -- Флаг того, что буфер полон: -- Full <= '1' when (Full_Match = '1' or (Addr_Write_Bin_Next(Addr_Size - 1 downto 0) = Addr_Read_Bin(Addr_Size - 1 downto 0) and Addr_Write_Bin_Next(Addr_Size) /= Addr_Read_Bin(Addr_Size) and (RE = '0' and WE = '1'))) else '0'; -- Сравнение адресов записи и чтения для флага того, что буфер пуст: -- Empty_Match <= '1' when (Addr_Write_Bin = Addr_Read_Bin and (WE = '0' or (RE = '1' and WE = '1'))) else '0'; -- Флаг того, что буфер пуст: -- Empty <= Empty_Match; end architecture RTL;
  3. ЦитатаДобрый день! Я разбираюсь с БПФ и не могу понять, как на практике вычисляются поворачивающий множитель W ?, в книжках написано W= e^(-j*2*p*n*k/N), k- номер отсчета, N- длина последовательности, n- текущий номер, толи я не те книжки читаю( Все правильно. Вы читаете именно те книжки.
  4. Poluektovich спасибо за ссылки!!! Приятно, что даже на русском, я даже и не надеялся. Буду читать, осваивать, позже мыслях по этому поводу. отпишусь о свои CaPpuCcino, Вам спасибо за дельный ответ, все по пунктам.
  5. yes, спасибо Вам за развернутый ответ. С языком C++ не дружен к сожалению. А вот взять, например систему на кристалле (SoC). Вот есть некий процессор, шинный интерфейс и ПЛИС. Для такой задачи лучше видимо подойдет SystemC, нежели SystemVerilog, или тут они примерно равны? Вот хочу еще разобраться с TLM. Насколько его сложно освоить и с чего лучше начать, чтобы понять концепцию (видимо с понятия класса)? Как писать (например те же шинные интерфейсы) на этом уровне, что нужно учитывать (вопрос философии)? Цитатанапример для DDR контроллера применять СистемЦ, имхо, смысла нет Ну я имел ввиду транзакционную модель, чтобы использовать ее для отладки остальной части проекта, или так не делают? Есть ли какие-нибудь готовые проекты или примеры с описанием применения TLM от простого к сложному?
  6. Введение я написал, дабы не раздуть новое обсуждение на тему для чего он нужен и кто поддерживает/не поддерживает синтез, ну и т.д. Поиском по форуму естественно пользовался: появилось больше вопросов, чем ответов. Эти вопросы я и задаю. Пытаюсь проникнуться философией этого языка. В основном интересует TLM.
  7. Самым главным достоинством языка SystemC является то, что можно подняться на системный уровень и спускаться до уровня RTL в рамках одного языка. Т.е. моделирование комплексной системы (системы на кристалле) можно производить оставаясь в едином языковом пространстве. Еще одним преимуществом является высокая скорость моделирования. Сначала создается высокоуровневая поведенческая модель системы. Все сложные элементы (такие как шины, процессоры, DDR-памяти, интерфейсы и т.д.) строятся на базе транзакционных моделей (TLM). Проверяется правильность функционирования системы в целом. В полученной модели выделяются блоки, отвечающие за аппаратную часть (HardWare), и блоки, отвечающие за программную часть (SoftWare). Далее программисты и аппаратчики работаю параллельно: программисты пишут программы на C (C++), а аппаратчики спускаются на уровень регистровых передач (RTL). Таким, образом обе группы (HardWare и SoftWare) изначально работают с одной моделью, а в процессе разработки TLM-блоки заменяются уже своими физическими (или программными) эквивалентами. Не совсем понятно как взаимодействуют блоки на разных уровнях - TLM и RTL. Пример: память DDR и контроллер к ней написан на уровне TLM, а блок, использующий ее написан на RTL-уровне. Настораживает, что в интернете так и не нашел TLM-моделей стандартных элементов (к примеру той же DDR-памяти или шины). Есть ли у кого-нибудь опыт разработки целой системы с использованием SystemC? На сколько там все прозрачно? Оправдывает ли себя вообще такой подход? Какие есть возможности визуализации и документирования создаваемого проекта? Можно ли в проект на SystemC делать VHDL-вставки RTL-уровня?
  8. А ну да, коэффициенты у нас лежат в диапазоне от -1024 до 1024.
  9. А вот так не подойдет: CODEentity FIFO_Reg is generic(Width : integer); Port ( Data_In : in STD_LOGIC_VECTOR (Width-1 downto 0); WRITE : in STD_LOGIC; FULL : out STD_LOGIC; CLK : in STD_LOGIC; CE : in STD_LOGIC; RST : in STD_LOGIC; Dato_Out : out STD_LOGIC_VECTOR (Width-1 downto 0); READ : in STD_LOGIC; EMPTY : out STD_LOGIC:='1'); end FIFO_Reg; architecture RTL of FIFO_Reg is signal Empty_State, Empty_State_Next : std_logic:='1'; signal Data_Out_Buf, Data_Out_Next : std_logic_vector(Width-1 downto 0); begin EMPTY <= Empty_State; DO <= Data_Out_Buf; -- Sync Process -- process(CLK,nRESET) begin if RST='1' then Empty_State <= '1'; elsif rising_edge(CLK) then if CE='1' then Empty_State <= Empty_State_Next; Data_Out_Buf <= Data_Out_Next; end if; end if; end process; -- End of Sync Process -- -- Comb Process -- process(Empty_State, nWRITE, Data_In, READ, Data_Out_Buf) begin -----Default Values----- Empty_State_Next <= Empty_State; FULL <= '1'; Data_Out_Next <= Data_Out_Buf; -----Case section----- case (Empty_State) is when '1' => if WRITE='0' then FULL <= '0'; Data_Out_Next <= (others => 'X'); else Empty_State_Next <= '0'; FULL <= '0'; Data_Out_Next <= Data_In; end if; when '0' => if READ='1' then if WRITE='1' then FULL <= '0'; Data_Out_Next <= Data_In; else Empty_State_Next <= '1'; FULL <= '0'; Data_Out_Next <= (others => 'X'); end if; end if; when others=>NULL; end case; end process; end RTL; И можно последовательно подключить сколько угодно таких буферов.
  10. ЦитатаФайл создается с помощью матлабовских скриптов или есть отдельная утилита? С помощью Matlab'овских скриптов. Посредством функции Matlab frintf, нужные значения записываются в файл.
  11. ЦитатаБеда в том что он не создает потом vhdl файл. Как вы это определили? Matlab в командном окне выводит какое-нибудь сообщение?
  12. ЦитатаСобственно если мне нужно получить полосовой фильтр, то vhdl код тоже надо подкорректировать?)) А потом туда загонять уже расчитаные коэффициенты из матлаба? Зачем? Изменяй m-файл! Я же тебе даже примерно написал, что нужно изменять всообщении. И нажимай Run. Далее пихай VHDL-файл в свой проект, предварительно протестив.
  13. Цитатакорректировка параметров фильтра происходит в vhdl коде Именно так!
  14. ЦитатаУважаемый Zed, можно попросить Вас немного пояснить как собственно программы данные запускаются, честно не понял, попробовал через симулинк не вышло, какой блок ее вызывает? Ну во-первых это файлы с расширением *.m, значит они Matlab'овские. Т.е. открываеть его нужно в Matlab, а не Simulink. Далее нажимаете запуск (Run) и на диске C у вас появится файл с названием filter.vhd. ЦитатаИ собственно vhdl код насколько я понимаю Вы получаете с помощью встроенного в матлаб кодера? Нет с помощью Matlab'а я получаю коэффициенты фильтра с заданными характеристиками и перевожу их в дополнительный код. Также мой Matlab'овский файл содержит "скелет" VHDL-кода, написанного мной, куда просто подставляются коэффициенты. Далее этот код записывается в файл C:\filter.vhd. Когда откроете файл Вы все поймете, там достаточно комментариев. Если что-то не понятно, спрашивайте. Успехов! P.S. Также вы можете менять параметры фильтра: полосу пропускания, частоту дискретизации, неравномеерность в полосе пропускания и т.д. Затем Вы снова нажимаете Run и получаете новый файл filter.vhd уже с новыми параметрами (коэффициентами).
  15. Вот коэффициенты ROM_x.mif плюс файл Matlab для их генерации. Надеюсь ничего не напутал.