Jump to content
    

jenya7

Участник
  • Posts

    3,718
  • Joined

  • Last visited

Reputation

0 Обычный

About jenya7

  • Rank
    Гуру
    Гуру

Recent Profile Visitors

12,449 profile views
  1. я когда кликаю в дереве проекта на моддуле PLL появляется wizzard и я вижу все настройки. у модуля ADC есть внутренний PLL, но почему то в другом проекте он не компилируется как аппаратный PLL. я думал может модуль ADC как то криво компилируется но я не получаю никаких ошибок пока не добавляю эту строку в процессе сканирования каналов. Сделал такой эксперимент. Вернул строку Adc1State <= ST_START_CONV; и в следующем состоянии убрал adc1_com_valid <= '1'; when ST_START_CONV => --adc1_com_valid <= '1'; Adc1State <= ST_WAIT_FOR_DONE; и всё компилируется. сигнал adc1_com_valid это начало конвертации канала. то есть если убрать эту строку то внутренний PLL ADC модуля реализуется фитером как то иначе? что за жесть?
  2. там же блок - if - else. если одно условие - иди направо, другое условие - иди налево. и потом - как это влияет на решения фитера создать ещё один PLL?
  3. Есть проект с MAX10 10M50SAE144I7G. Добавил в проект модули PLL и ADC с уже существующего проекта с таким же FPGA. component pll is port ( inclk0 : in std_logic := '0'; c0 : out std_logic; c1 : out std_logic; c2 : out std_logic; c3 : out std_logic ); end component; component adc_qsys is port ( adc_1_command_valid : in std_logic := '0'; -- adc_1_command.valid adc_1_command_channel : in std_logic_vector(4 downto 0) := (others => '0'); -- .channel adc_1_command_startofpacket : in std_logic := '0'; -- .startofpacket adc_1_command_endofpacket : in std_logic := '0'; -- .endofpacket adc_1_command_ready : out std_logic; -- .ready adc_1_response_valid : out std_logic; -- adc_1_response.valid adc_1_response_channel : out std_logic_vector(4 downto 0); -- .channel adc_1_response_data : out std_logic_vector(11 downto 0); -- .data adc_1_response_startofpacket : out std_logic; -- .startofpacket adc_1_response_endofpacket : out std_logic; -- .endofpacket clk_clk : in std_logic := '0'; -- clk.clk reset_reset_n : in std_logic := '0' -- reset.reset_n ); end component; ----------------------------------------------------------------------------------------------------------------- U_SYS_PLL : pll port map ( inclk0 => OBE_CLK, c0 => s_pll_clk_120M, c1 => s_pll_clk_100M, c2 => s_pll_clk_30M, c3 => s_pll_clk_10M ); U_SYS_ADC : adc_qsys port map ( clk_clk => s_pll_clk_10M, reset_reset_n => '1', adc_1_command_valid => adc1_com_valid, adc_1_command_channel => adc1_com_channel, adc_1_command_startofpacket => adc1_com_startofpacket, adc_1_command_endofpacket => adc1_com_endofpacket, adc_1_command_ready => adc1_com_ready, adc_1_response_valid => adc1_resp_valid, adc_1_response_channel => adc1_resp_channel, adc_1_response_data => adc1_resp_data, adc_1_response_startofpacket => adc1_resp_startofpacket, adc_1_response_endofpacket => adc1_resp_endofpacket ); Всё скомпилировалось без проблем. Я добавил процесс сканирования всех каналов каждые 100 мс. И тут фитер генерирует ошибку Он почему то генерирует два PLL а на самом деле есть один. Начал убирать куски кода в процессе и нашел что если убрать всего одну строчку Adc1State <= ST_START_CONV; то всё компилируется. when ST_SELECT_CHAN => adc1_ena <= '0'; chan := chan + 1; if (chan > 8) then Adc1State <= ST_WAIT_FOR_TRIG; else case chan is when 1 => adc_chan := "00001"; when 2 => adc_chan := "00010"; when 3 => adc_chan := "00011"; when 4 => adc_chan := "00100"; when 5 => adc_chan := "00101"; when 6 => adc_chan := "00110"; when 7 => adc_chan := "00111"; when 8 => adc_chan := "01000"; when others => end case; --Adc1State <= ST_START_CONV; --без этой строчки компилируеися end if; Это как вообще?
  4. интересно а как без if (clk3 = '1') then? не работать по фронту? а как тогда? после многих экспериментов непосредственно прием-передачу я разбил на два процесса. работает чётко, без проблем. проблема возникала в синхронизации - DATA_OUT. мой изначальный вопрос - когда DATA_IN = 0x34 - buf_in = 0x1 0x4 - а должно быть 0x3 0x4 - это было именно из рассинхрона между модулями. почему то это оказалось непростой задачей несмотря на то что модуль передающий DATA_OUT сидит на тех же SPI_CS и SPI_CLK. процесс передающий DATA_OUT был записан так if (clk3 = '1') then clk2_count := clk2_count + 1; end if; case clk2_count is when 0 => data_1553_out <= DOUT(7 downto 0); when 1 => data_1553_out <= DOUT(7 downto 0); when 2 => data_1553_out <= DOUT(7 downto 0); when 3 => data_1553_out <= DOUT(15 downto 8); when 4 => data_1553_out <= DOUT(15 downto 8); State <= ST_READ_3; when others => end case; переписал так if (clk3 = '1') then clk2_count := clk2_count + 1; end if; if (clk2_count = 4) then State <= ST_READ_3; else if (clk2_count < 2) then data_1553_out <= DOUT(7 downto 0); else data_1553_out <= DOUT(15 downto 8); end if; и теперь работает нормально.
  5. LIBRARY ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; видел эти варианты. в первом input logic MOSI_0, input logic MOSI_1, input logic MOSI_2, input logic MOSI_3, output logic MISO_0, output logic MISO_1, output logic MISO_2, output logic MISO_3 у меня нет отдельных линий. у меня SPI_DATA : inout std_logic_vector(3 downto 0); второй вариант похож на вуду маджик.
  6. Всё. Когда мат иссяк пошёл посмотрел старые проекты - он там всё переделал. В новом проекте он уже забыл об этом. Извиняюсь за это насилие над коллективным разумом.
  7. тут нужно объясниться. в нормальном мире такое не может произойти. но у нас один кадр написал парсер на сотни строк в таком виде if(strcmp(ToLower(args[1]), ToLower("WRITE")) == 0) ему видите ли так удобно. я не уследил и это художество гуляет уже в нескольких проектах. но работает. а в новом камне с внешней флеш памятью вылезла проблема.
  8. не знаю. у нас все проекты прожигаются во флеш, по крайней мере наш код. в RAM алоцируются только системные функции.
  9. это не указатель на константу? компилятор выделит переменную в RAM? почему нет? во всех кортексах работает. и не только.
  10. есть такая ф-ция char *ToLower(char *str) { int i; for(i = 0; i < strlen(str); i++) { if(str[i]>='A' && str[i]<='Z') str[i]=str[i]+32; } return str; } когда передаю переменную в качестве аргумента во всех контролерах работает без проблем. ToLower(some_string); когда передаю константную строку в качестве аргумента ToLower("WRITE"); в контролерах с внутренней флеш памятью работает без проблем. а в контролерах с внешней флеш памятью (по крайней мере в NXP) компайлер помещает строку во флеш и я соответсвенно получаю void MemManage_Handler(void) { while(1) {} } можно как то какой нибудь прагмой объяснить компайлеру чтоб помещал строку в RAM?
  11. упс. мой фак. исправил но не помогло. ЮАРТ и у меня работает чики пуки. с ним нет проблем.
  12. изначально я работал по системному клоку process(CLK) variable clk_count : integer range 0 to 2 := 0; begin if (SPI_CS = '0') then if (s_ready_read = '1') then if (rising_edge(CLK)) then if (clk3 = '1') then case clk_count is when 0 => buf_in <= DATA_IN(7 downto 4); clk_count := 1; when 1 => buf_in <= DATA_IN(3 downto 0); clk_count := 0; when others => end case; end if; end if; end if; else buf_in <= DATA_IN(7 downto 4); clk_count := 0; end if; end process; та же херня.
  13. есть процесс в другом модуле process(CLK) begin if (rising_edge(CLK)) then clk1 <= SPI_CLK; clk2 <= clk1; end if; end process; clk3 <= not clk2 and clk1; SPI_TX_DATA <= sspi_data_out when s_out_select = '0' else data_1553_out; ------------ IN PROCESS ------- when ST_READ_1 => s_out_select <= '1' Bustate <= ST_READ_2; when ST_READ_2 => debug <= X"12"; if (clk3 = '1') then clk2_count := clk2_count + 1; end if; case clk2_count is when 0 => data_1553_out <= DOUT(7 downto 0); when 1 => data_1553_out <= DOUT(7 downto 0); when 2 => data_1553_out <= DOUT(7 downto 0); when 3 => data_1553_out <= DOUT(15 downto 8); when 4 => data_1553_out <= DOUT(15 downto 8); clk2_count := 0; Bustate <= ST_READ_3; when others => end case; а SPI_TX_DATA соединен с DATA_IN честно говоря взыл бы готовый QUAD SPI и не парился ни минуты. забавно что нигде не нашел готовый модуль.
  14. top entity получает с PLL 120 мега. но в данном процессе я сижу на SPI Clock.
×
×
  • Create New...