Jump to content

    

ZED

Свой
  • Content Count

    261
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ZED

  • Rank
    Местный

Контакты

  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1807 profile views
  1. Я, честно говоря, не особо понимаю как время-импульсное кодироваие может быть применено в радиолокации, ведь по времени между излученным и отраженным импульсом оределяется расстояние до цели. А если это время меняется хоть по определенному закону непонятно на какую дальность рассчитывать (нацеливаться). Поэтому и используют равное расстояние между импульсами, да и импульсы одинаковой длины. Единственное где могло бы найти применение время-импульсное кодирование, - это в радиолокации с активным ответом.
  2. Вот решил написать свой вариант FIFO-буфера, правда я его в кристалле не тестировал. Прошу покритиковать. library 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; FIFO.rar
  3. Все правильно. Вы читаете именно те книжки.
  4. Poluektovich спасибо за ссылки!!! Приятно, что даже на русском, я даже и не надеялся. Буду читать, осваивать, позже мыслях по этому поводу. отпишусь о свои CaPpuCcino, Вам спасибо за дельный ответ, все по пунктам.
  5. yes, спасибо Вам за развернутый ответ. С языком C++ не дружен к сожалению. А вот взять, например систему на кристалле (SoC). Вот есть некий процессор, шинный интерфейс и ПЛИС. Для такой задачи лучше видимо подойдет SystemC, нежели SystemVerilog, или тут они примерно равны? Вот хочу еще разобраться с TLM. Насколько его сложно освоить и с чего лучше начать, чтобы понять концепцию (видимо с понятия класса)? Как писать (например те же шинные интерфейсы) на этом уровне, что нужно учитывать (вопрос философии)? Ну я имел ввиду транзакционную модель, чтобы использовать ее для отладки остальной части проекта, или так не делают? Есть ли какие-нибудь готовые проекты или примеры с описанием применения 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. FFT_Coefficients.rar
  9. А вот так не подойдет: entity 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. Как вы это определили? Matlab в командном окне выводит какое-нибудь сообщение?
  12. Зачем? Изменяй m-файл! Я же тебе даже примерно написал, что нужно изменять всообщении. И нажимай Run. Далее пихай VHDL-файл в свой проект, предварительно протестив.
  13. Ну во-первых это файлы с расширением *.m, значит они Matlab'овские. Т.е. открываеть его нужно в Matlab, а не Simulink. Далее нажимаете запуск (Run) и на диске C у вас появится файл с названием filter.vhd. Нет с помощью Matlab'а я получаю коэффициенты фильтра с заданными характеристиками и перевожу их в дополнительный код. Также мой Matlab'овский файл содержит "скелет" VHDL-кода, написанного мной, куда просто подставляются коэффициенты. Далее этот код записывается в файл C:\filter.vhd. Когда откроете файл Вы все поймете, там достаточно комментариев. Если что-то не понятно, спрашивайте. Успехов! P.S. Также вы можете менять параметры фильтра: полосу пропускания, частоту дискретизации, неравномеерность в полосе пропускания и т.д. Затем Вы снова нажимаете Run и получаете новый файл filter.vhd уже с новыми параметрами (коэффициентами).
  14. Вот коэффициенты ROM_x.mif плюс файл Matlab для их генерации. Надеюсь ничего не напутал. FFT_Coefficients.rar