acvarif 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Имеется дешифратор типа process(clk) begin if clk'event and clk = '0' then if s_rclk = '0' then s_we_res <= "1111111111111111"; else case s_address_rdram is when "0000" => s_we_res <= "1111111111111110"; when "0001" => s_we_res <= "1111111111111101"; when "0010" => s_we_res <= "1111111111111011"; when "0011" => s_we_res <= "1111111111110111"; when "0100" => s_we_res <= "1111111111101111"; when "0101" => s_we_res <= "1111111111011111"; when "0110" => s_we_res <= "1111111110111111"; when "0111" => s_we_res <= "1111111101111111"; when "1000" => s_we_res <= "1111111011111111"; when "1001" => s_we_res <= "1111110111111111"; when "1010" => s_we_res <= "1111101111111111"; when "1011" => s_we_res <= "1111011111111111"; when "1100" => s_we_res <= "1110111111111111"; when "1101" => s_we_res <= "1101111111111111"; when "1110" => s_we_res <= "1011111111111111"; when "1111" => s_we_res <= "0111111111111111"; when others => s_we_res <= "1111111111111111"; end case; end if; end if; end process; Но требуется такой-же дешифратор но уже не на 16, а на 48 нулей Можно-ли как-то упростить писанину, на цикле или еще как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimidrol 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Имеется дешифратор типа ... Можно-ли как-то упростить писанину, на цикле или еще как? Может написать функцию? По идее, можно написать компактно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Здравствуйте. Можно. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; process(clk) variable s_we_res_temp : std_logic_vector(47 downto 0); begin if clk'event and clk = '0' then if s_rclk = '0' then s_we_res <= (others => '1'); else s_we_res_temp := (others => '1'); s_we_res_temp(conv_integer(s_address_rdram)) := '0'; s_we_res <= s_we_res_temp; end if; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба process (clk) variable Cnt: integer range 0 to 47; begin process (clk) if rising_edge(clk) then cnt:=conv_integer(s_address_rdram); s_we_res<=(cnt=>'0',others=>'1'); end if; end process; Или просто логикой For i in 0 to 47 generate s_we_res(i)<='1' when conv_integer(s_address_rdram)=i else '0'; end generate Или так if rising_edge(clk) then s_we_res<=(others=>'1'); s_we_res(conv_integer(s_address_rdram))<='0'; end if; UPD TRILLER, а зачем промежуточное значение типа переменной? Все равно приоритет имеет последнее присвоение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Имеется дешифратор типа process(clk) begin if clk'event and clk = '0' then if s_rclk = '0' then s_we_ res <= "1111111111111111"; else case s_address_rdram is when "0000" => s_we_res <= "1111111111111110"; when "0001" => s_we_res <= "1111111111111101"; ... when "1111" => s_we_res <= "0111111111111111"; when others => s_we_res <= "1111111111111111"; end case; end if; end if; end process; Но требуется такой-же дешифратор но уже не на 16, а на 48 нулей Можно-ли как-то упростить писанину, на цикле или еще как? Можно вот так: process(clk) variable decoder_v : std_logic_vector(2**s_address_rdram'length-1 downto 0) := (others => '1'); begin decoder_v := (others => '1'); decoder_v(conv_integer(unsigned(s_address_rdram)) := '0'; decoder_i <= decoder_v; end process; process(clk) begin if clk'event and clk = '0' then if s_rclk='0' then s_we_ res <= "1111111111111111"; else s_we_ res <= decoder_i; end if; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 (изменено) · Жалоба Ну, в данном случае не нужно. Просто, иногда неоходимо, допустим, поксорить несколько элементов между собой или ещё чего. А так, действительно не нужно. Сколько решений простой задачи мы предложили. Вот так бы со сложными))) Изменено 19 декабря, 2012 пользователем TRILLER Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Кто бы мне сейчас накидал решений, почему в модели Xilinx MIG RLDRAMII не выполняется init_calib_complete при моделировании :-( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба а в доке ничего про это не написано - если я правильно помню его очень долго надо ждать и поэтому генериком ставится таймаут через сколько его выставить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Для DDR3 я его дожидался 80мкс, коллега вот дал старый проект, для MIG 1.49, тут init_calib_complete выставляется через 28мкс В процессе калибровки он что то кидает в память, что то читает. А у меня одна транзакция в начале и молчок. 200мкс моделил, все равно молчит. Такое чувство, что где то что то не подключилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Спасибо всем за варианты. Все работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться