Jump to content

    

Maverick_

Модераторы
  • Content Count

    3499
  • Joined

  • Last visited

Community Reputation

10 Хороший

About Maverick_

  • Rank
    я только учусь...
  • Birthday 01/12/1979

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Украина

Recent Profile Visitors

21095 profile views
  1. http://aperiodic.net/phil/archives/Geekery/find-duplicate-elements.html
  2. Input: [1, 4, 3, 3, 2, 5] Sum = 18 As in this example, we have n = 5: Sum of 1 to 5 = 1 + 2 + 3 + 4 + 5 = 15=> 18 - 15 = 3 so 3 is the duplicate но Input: [1, 2, 3, 2, 3, 4] Sum = 15As in this example we have n = 5, Sum of 1 to 5 = 1 + 2 + 3 + 4 + 5 = 15/!\ Not working
  3. Спасибо, отпишитесь пожалуйста по результатам реализации
  4. Вот моя наброска самой простой реализации (не проверял, но логически вроде верно) - на вход поставить паралельно-последовательный конвертор, чтобы на вход моего модуля данные (Ваши 25 чисел) приходили последовательно) library ieee; use ieee.std_logic_1164.all; library work; package Const_type is type my_array is array (0 to 255) of std_logic_vector (7 downto 0); end package; library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; use work.Const_type.all; entity hist is Port ( CLK : in std_logic; rst : in std_logic; indata : in std_logic_vector (7 downto 0); ready : out std_logic; outdata : out std_logic_vector (7 downto 0); ); end hist; architecture behavioral of hist is signal table_index : my_array; signal reg_data : std_logic_vector (7 downto 0); signal reg_index : std_logic_vector (7 downto 0); signal reg_state : std_logic_vector (1 downto 0);; begin process (all) begin if (rst = '1') then reg_index <= (OTHERS => (OTHERS => '0')); reg_state <= (others => '0'); reg_ready <= '0'; reg_index <= (others => '0'); reg_data <= (others => '0'); elsif (CLK'event and CLK ='1') then if reg_state = "00" then -- read data from table reg_data <= indata; reg_index <= table_index(to_integer(unsigned(indata))); reg_state <= std_logic_vector( unsigned(reg_state) + 1); reg_ready <= '0'; elsif reg_state = "01" then -- calculation index reg_state <= std_logic_vector( unsigned(reg_state) + 1); reg_index <= std_logic_vector( unsigned(reg_index) + 1); elsif reg_state = "10" then -- write new date to table reg_state <= (OTHERS => '0'); table_index (to_integer(unsigned(reg_data))) <= reg_index; reg_ready <= '1'; end if; end if; end process; outdata <= table_index (to_integer(unsigned(reg_data))); ready <= reg_ready; end behavioral; Реализация простая есть так сказать 3 состояния/такта (reg_state). На каждом состоянии/такте происходит соотвующая операция: 1. чтение данных из таблицы; 2 инкремент индекса 3 запись нового значения индекса в таблицу Далее все начинается сначала... PS Далее делаем второй модуль который сделать по сигналу ready сравнивает значение индексов (выход outdata) с предыдущим значение. Внутренний регистр в котором будет храниться максимальное число инициализируете максимальным числом (как то так reg_max <= (others => '1');) не проверял - наброски... library ieee; use ieee.std_logic_1164.all; library work; package Const_type is type my_array is array (0 to 24) of std_logic_vector (7 downto 0); end package; library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; use work.Const_type.all; entity parallel2serial is generic( num : integer:= 25 ); port ( i_clk : in std_logic; i_rstb : in std_logic; i_data_ena : in std_logic; i_data : in my_array; o_data_valid : out std_logic; o_data : out std_logic_vector (7 downto 0)); end parallel2serial; architecture rtl of parallel2serial is signal r_data : my_array; signal r_count : integer range 0 to (num-1); begin p_paralle2serial : process(all) begin if(i_rstb='0') then r_count <= 0; elsif(rising_edge(i_clk)) then if i_data_ena = '1' then r_count <= r_count + 1; o_data <= i_data(r_count); end if; if r_count = 24 then o_data_valid <= '1'; else o_data_valid <= '0'; end if; end if; end process p_paralle2serial; Будут вопросы спрашивайте :) паралельная pipeline реализация займет больше ресурсов чем представленная последовательная реализация
  5. 2 ЕвгенийЗлыднев Для старта можно попробовать так: Создаем (исходя что 2^8=256) массивы регистров: - таблицы данных 256х8бит регистров (с начальной инициализацией равной 0) -таблицы индексов 256х8бит регистров (с начальной инициализацией равной 0). По приходу нового значения (само значение это адрес для таблицы 256х8бит регистров). Читаем по данному адресу если там уже имеется такое же число (работает 8 бит компаратор на равенство) и параллельно читаем индекс для данного регистра (адрес одинаковый для двух таблиц), то производим прибавление 1 для данного индекса иначе прибавляем 0 и записываем результат полученного индекс обратно в таблицу индексов. И так далле. В конце если требуется найти максимальное число повторений можно модифицировать такой поиск по таблице индексов (там же можете посмотреть как создавать массивы регистров): PS Массивы регистров можно заменить при необходимости память на BRAM или ALM(SRL). Скорее всего нужна только одна таблица индексов (оптимизация за Вами). Например просто добавить в таблицу индексов один бит по которому можно будет судить было ли раннее такое входное число.
  6. Ответ супер. Повеселил. спасибо.
  7. в таком случае PLL использовать для автора не вариант?
  8. вложение... возможно поможет... coder_decoder_1553_v.zip
  9. ///////////////////////////////////////////////////////////////////////////////////////////////// //Scatter Gather DMA controller 2 printf( "\n\n------------- Scatter DMA 2---------------\n\n" ); //create descriptors in the mapped memory struct alt_avalon_sgdma_packed *sgdma_desc01=sdram_16MB_add; struct alt_avalon_sgdma_packed *sgdma_desc02=sdram_16MB_add+sizeof(struct alt_avalon_sgdma_packed); struct alt_avalon_sgdma_packed *sgdma_desc03=sdram_16MB_add+2*sizeof(struct alt_avalon_sgdma_packed); struct alt_avalon_sgdma_packed *sgdma_desc_empty0=sdram_16MB_add+3*sizeof(struct alt_avalon_sgdma_packed); //Address to the physical space void* sgdma_desc1_phys0=(void*)SDRAM_16_BASE; void* sgdma_desc2_phys0=(void*)SDRAM_16_BASE+sizeof(struct alt_avalon_sgdma_packed); void* sgdma_desc3_phys0=(void*)SDRAM_16_BASE+2*sizeof(struct alt_avalon_sgdma_packed); void* sgdma_desc_empty_phys0=(void*)SDRAM_16_BASE+3*sizeof(struct alt_avalon_sgdma_packed); //configure the descriptor initDescriptor(sgdma_desc01,(void*)DUALPORT_RAM_0_BASE,(void*)(SDRAM_64_BASE+40), sgdma_desc2_phys0,8*20, //sgdma_desc2_phys ( _SGDMA_DESC_CTRMAP_OWNED_BY_HW)); initDescriptor(sgdma_desc02,(void*)DUALPORT_RAM_1_BASE,(void*)(SDRAM_64_BASE+120), sgdma_desc_empty_phys0,8*20, ( _SGDMA_DESC_CTRMAP_OWNED_BY_HW)); /*initDescriptor(sgdma_desc01,(void*)ONCHIP_MEMORY_BASE,(void*)(SDRAM_64_BASE), sgdma_desc_empty_phys,4*20, ( _SGDMA_DESC_CTRMAP_OWNED_BY_HW));*/ /*initDescriptor(sgdma_desc3,(void*)SDRAM_64_BASE,(void*)MEMORYDMA_M_WRITE_MYBUS_BASE, sgdma_desc_empty_phys,4*30, (_SGDMA_DESC_CTRMAP_WRITE_FIXED_ADDRESS | _SGDMA_DESC_CTRMAP_OWNED_BY_HW));*/ initDescriptor(sgdma_desc_empty0,NULL,NULL, sgdma_desc_empty_phys0,0, (_SGDMA_DESC_CTRMAP_WRITE_FIXED_ADDRESS)); //map memory of the control register h2p_lw_sgdma_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + 0x40 ) & ( unsigned long)( HW_REGS_MASK ) ); printf( "sgma2 addr %08x\n", ((uint32_t *)h2p_lw_sgdma_addr)); printf( "sgma2 status %08x\n", *((uint32_t *)h2p_lw_sgdma_addr)); ////fill the data space //for (long int i=0;i<256; i++){ // *((uint32_t *)sdram_64MB_add+i)=i; //} //init the SGDMA controller init_sgdma(_SGDMA_CTR_IE_CHAIN_COMPLETED); debugPrintRegister(); //set the address of the descriptor setDescriptor(sgdma_desc1_phys0); //start the transfer setControlReg(_SGDMA_CTR_IE_CHAIN_COMPLETED|_SGDMA_CTR_RUN); debugPrintRegister(); //wait until transfer is complete waitFinish(); //for (long int i=0;i<256; i++){ //printf( "%d\n", *((uint32_t *)sdram_64MB_add+i)); // } printf( "/*///////////////////*/////////////////*/ \n"); for (long int i=0;i<256; i++){ //printf( "%d\n", *((uint64_t *)sdram_64MB_add+i)); printf("%" PRIx64 "\n", *((uint64_t *)sdram_64MB_add+i)); } //printf( "////////////////////////////////////// \n"); //for (int i=0;i<40;i++){ //printf( "%d\n", *((uint64_t *)h2p_rom_addr+i)); //printf("%" PRIx64 "\n", *((uint64_t *)h2p_rom_addr+i)); //} debugPrintDescriptorStatus(sgdma_desc01); //stop the core by clearing the run register setControlReg(_SGDMA_CTR_IE_CHAIN_COMPLETED); debugPrintDescriptorStatus(sgdma_desc01); ////////work interupt receive (double_edge_detector_irq) /////////////////////////////////////////////////////////// //h2p_intr_capturer_addr *(uint64_t *)h2p_intr_capturer_addr = 2; for (int k = 0; k < 8; k++) { printf( "intr_capturer k = %d\n", *((uint32_t *)h2p_intr_capturer_addr+k)); } пытаюсь захватить вырабатываемое прерывание модулем на логике, чтобы знать что прерывание действительно было. создал в платформ дизайнере проект (скришот вложение) написал программу (см выше) - извините не привык к новому движку сделал так сказать обработчик прерываний на логике library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity double_edge_detector_irq is GENERIC( Num_bit : INTEGER := 64); port ( clk : in std_logic; rst : in std_logic; irq_in : in std_logic; -- bus Avalon MM avs_address : in std_logic_vector (1 downto 0); avs_readdata : out std_logic_vector ((Num_bit-1) downto 0); avs_write : in std_logic; avs_read : in std_logic; avs_writedata : in std_logic_vector ((Num_bit-1) downto 0) ); end double_edge_detector_irq; architecture rtl of double_edge_detector_irq is signal din_delayed1 :std_logic; signal reg_change :std_logic; signal reg_data : std_logic_vector ((Num_bit-1) downto 0); signal count : std_logic_vector (((Num_bit/2)-1) downto 0); begin process(clk, rst) begin if rst = '1' then din_delayed1 <= '0'; elsif rising_edge(clk) then din_delayed1 <= irq_in; end if; end process; reg_change <= (din_delayed1 xor irq_in); --rising or falling edge (0 -> 1 xor 1 -> 0) process(clk, rst) begin if rst = '1' then count <= (others => '0'); elsif rising_edge(clk) then if avs_write = '1' then count <= avs_writedata(((Num_bit/2)-1) downto 0); else if reg_change = '1' then count <= std_logic_vector(unsigned(count) + 1); end if; end if; end if; end process; process(clk, rst) begin if rst = '1' then avs_readdata <= (others => '0'); elsif rising_edge(clk) then if avs_read = '1' then if avs_address = "00" then avs_readdata <= reg_data((Num_bit-2) downto 0)&reg_change; elsif avs_address = "01" then avs_readdata(31 downto 0) <= count; end if; end if; end if; end process; end rtl; пытаюсь считать на модуле обработчика прерывания - по нулям (программа после ////////work interupt receive (double_edge_detector_irq) /////////////////////////////////////////////////////////// )... Может кто-то сталкивался с такой проблемой - прошу помощи
  10. не проще было написать clk_i <= not(clk);
  11. вопрос снят ... Всем спасибо за помощь :)
  12. Вы правы не подключен был, подключил double_edge_detector_irq.vhd
  13. задействован - самая последняя строка в tcl скрипте
  14. Добрый день. подскажите пожалуйста где в tcl скрипте ошибка, что платформ дизайнер (Qsys) не хочет видеть IP core (в IP каталоге платформ дизайнер (Qsys) отсутствует) double_edge_detector_irq.tcl double_edge_detector_irq.vhd