Jump to content

    

jenya7

Участник
  • Content Count

    3425
  • Joined

  • Last visited

Everything posted by jenya7


  1. вы перешли на Верилог? вроде как были приверженец VHDL. :)
  2. Раньше я делал на уровне VS не заморачиваясь TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1994, 1, 1); ulong totalMicrosec = (ulong)(timeSpan.TotalMilliseconds * 1000); теперь меня озадачили и мне нужно спуститься на уровень ниже. я решил высчитать микросекунды двух дат относительно epoch time и отнять два числа. uint64_t RTC_DateToUnixTimeMicro(RTC *rtc) { uint32_t y; uint32_t m; uint32_t d; uint64_t t; //Year y = rtc->year; //Month of year m = rtc->month; //Day of month d = rtc->day; //January and February are counted as months 13 and 14 of the previous year if(m <= 2) { m += 12; y -= 1; } //Convert years to days t = (365 * y) + (y / 4) - (y / 100) + (y / 400); //Convert months to days t += (30 * m) + (3 * (m + 1) / 5) + d; //Unix time starts on January 1st, 1970 t -= 719561; //Convert days to seconds to microseconds t *= 86400 * 1000000; //Add hours, minutes and seconds - to microseconds t += ((3600 * rtc->hours) + (60 * rtc->minutes) + rtc->seconds) * 1000000; //Return Unix time return t; } Вопрос - как эта математика синтезируется в FPGA, ничего не нужно менять?
  3. а как вы собираетесь исполнять программу? есть axis manager?
  4. а что значит "снимаем синхронно"?
  5. я понимаю. лично мне нравится второй вариант синхронный. но есть у него какие то преимущества? не хочется переписывать кучу модулей. темплейт дает <optional_label>: process(reset, clk) is -- Declaration(s) begin if(reset = '1') then -- Asynchronous Sequential Statement(s) elsif(rising_edge(clk)) then -- Synchronous Sequential Statement(s) end if; end process; вот я наштамповал а теперь сижу и думаю а правильно ли это.
  6. Есть большая разница как сделать? Так process (CLK, RST) begin if RST = '1' then --do something elsif (rising_edge(CLK)) then --do something end if; end process; Или так process (CLK, RST) begin if (rising_edge(CLK)) then if RST = '1' then --do something elsif --do something end if; end if; end process;
  7. Есть несколько проектов для которых надо написать тестбенчи в ModelSim. Язык VHDL. Такое вот предложение.
  8. спасибо. так, "в лоб" результаты совпадают. unsigned short crc_res; unsigned char crc_data[3] = {1,2,3}; int main() { crc16_8(1, crc_data[0]); for (int i = 0; i < 3; i++) { crc_res = crc16_8(0, crc_data[i]); } //crc_res = 0x821D } надеюсь меня тапками не закидают на Си стороне. ))
  9. Си вариант именно такой CRC algorithm name CRC-16/USB Polynomial formula x16 + x15 + x2 + 1 width 16 Polynomial 8005 Initial value FFFF Results are different or values FFFF Input reverse true Output reverse true
  10. vhdl версия результат 0х5А82 Си версия unsigned short crc(unsigned char *ptr, int len) { unsigned int i; unsigned short crc = 0xffff; while(len--) { crc ^= *ptr++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } } return ~crc; } unsigned short crc_res; unsigned char crc_data[3] = {1,2,3}; crc_res = crc(crc_data, 3); результат 0х9Е9Е несостыковочка однако эта строка меняет результат crc = (crc >> 1) ^ 0xA001; откуда взялось 0xA001? ошибся. каждый клок переписывает значение. надо так но всё равно результаты разные.
  11. спасибо. мне конечно без таблицы так как VHDL модуль без таблицы. мне си код нужен потому как посылка пакетов между FPGA и CPU. На стороне CPU нужен си аналог вычисления CRC.
  12. не знаю. если взять сгенерированный код architecture behavior of CRC16 is signal lfsr_q: std_logic_vector (15 downto 0) := (others => '1'); signal lfsr_c: std_logic_vector (15 downto 0); begin crc_out <= lfsr_q; lfsr_c(0) <= lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(0) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); lfsr_c(1) <= lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); lfsr_c(2) <= lfsr_q(8) xor lfsr_q(9) xor data_in(0) xor data_in(1); lfsr_c(3) <= lfsr_q(9) xor lfsr_q(10) xor data_in(1) xor data_in(2); lfsr_c(4) <= lfsr_q(10) xor lfsr_q(11) xor data_in(2) xor data_in(3); lfsr_c(5) <= lfsr_q(11) xor lfsr_q(12) xor data_in(3) xor data_in(4); lfsr_c(6) <= lfsr_q(12) xor lfsr_q(13) xor data_in(4) xor data_in(5); lfsr_c(7) <= lfsr_q(13) xor lfsr_q(14) xor data_in(5) xor data_in(6); lfsr_c(8) <= lfsr_q(0) xor lfsr_q(14) xor lfsr_q(15) xor data_in(6) xor data_in(7); lfsr_c(9) <= lfsr_q(1) xor lfsr_q(15) xor data_in(7); lfsr_c(10) <= lfsr_q(2); lfsr_c(11) <= lfsr_q(3); lfsr_c(12) <= lfsr_q(4); lfsr_c(13) <= lfsr_q(5); lfsr_c(14) <= lfsr_q(6); lfsr_c(15) <= lfsr_q(7) xor lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(0) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); process (CLK, RST) begin if RST = '1' then lfsr_q <= (others => '1'); elsif rising_edge(CLK) then if CRC_EN = '1' then lfsr_q <= lfsr_c; end if; end if; end process; то ближайший что я нашел unsigned short crc16(const unsigned char* data_p, unsigned char length) { unsigned char x; unsigned short crc = 0xFFFF; while (length--) { x = crc >> 8 ^ *data_p++; x ^= x>>4; crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x); } return crc; } как то не особо похож.
  13. в смысле подходящий? алгоритмы передающего и принимающего должны совпадать.
  14. Возник такой вопрос. Нужно проверить сгенерированный CRC на стороне CPU. Начал делать Си аналог модуля - выходит как то монструозно. Есть какой то Си аналог для этого модуля?
  15. спасибо. но что делать с результатом? entity crc is port ( data_in : in std_logic_vector (7 downto 0); crc_en , rst, clk : in std_logic; crc_out : out std_logic_vector (15 downto 0) ); end crc; это CRC на байт. а что делать с массивом? на данный момент я делаю в цикле crc_result <= crc_result xor crc_out;
  16. мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало.
  17. Есть модуль CRC entity CRC is port ( CLK: in std_logic; RST: in std_logic; DATA_IN: in std_logic_vector (7 downto 0); CRC_EN: in std_logic; CRC_OUT: out std_logic_vector (15 downto 0) ); end CRC; architecture behavior of CRC is signal lfsr_q: std_logic_vector (15 downto 0) := (others => '1'); signal lfsr_c: std_logic_vector (15 downto 0); begin crc_out <= lfsr_q; lfsr_c(0) <= lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(0) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); lfsr_c(1) <= lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); lfsr_c(2) <= lfsr_q(8) xor lfsr_q(9) xor data_in(0) xor data_in(1); lfsr_c(3) <= lfsr_q(9) xor lfsr_q(10) xor data_in(1) xor data_in(2); lfsr_c(4) <= lfsr_q(10) xor lfsr_q(11) xor data_in(2) xor data_in(3); lfsr_c(5) <= lfsr_q(11) xor lfsr_q(12) xor data_in(3) xor data_in(4); lfsr_c(6) <= lfsr_q(12) xor lfsr_q(13) xor data_in(4) xor data_in(5); lfsr_c(7) <= lfsr_q(13) xor lfsr_q(14) xor data_in(5) xor data_in(6); lfsr_c(8) <= lfsr_q(0) xor lfsr_q(14) xor lfsr_q(15) xor data_in(6) xor data_in(7); lfsr_c(9) <= lfsr_q(1) xor lfsr_q(15) xor data_in(7); lfsr_c(10) <= lfsr_q(2); lfsr_c(11) <= lfsr_q(3); lfsr_c(12) <= lfsr_q(4); lfsr_c(13) <= lfsr_q(5); lfsr_c(14) <= lfsr_q(6); lfsr_c(15) <= lfsr_q(7) xor lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(0) xor data_in(1) xor data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor data_in(7); process (CLK, RST) begin if RST = '1' then lfsr_q <= (others => '1'); elsif rising_edge(CLK) then if CRC_EN = '1' then lfsr_q <= lfsr_c; end if; end if; end process; end behavior; Но это CRC на один байт. А если мне нужен CRC на массив байтов, что я делаю с промежуточным результатом? и как вообще перебрать массив, в for i in 0 to x loop?
  18. Есть ADC core 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 adc_qsys; U_ADC_SYS : 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 ); раньше я использовал весь порт ADC1_IN1 - ADC1_IN8 и проблем не было. Теперь мне нужен только один аналоговый вход - ADC1_IN1. Остальные пины заняты другими задачами. Иду в кор и разрешаю только один канал, остальные галки снимаю. Но при компиляции вываливаются ошибки Кор всё равно видит пины как активные. Как разрешить проблему?
  19. ну вы всё равно не захотите жестко коротить бас на землю. поставте PTC последовательно. или poly fuse.