|
помогите с оператором case и делением частоты, не работает( |
|
|
|
Mar 19 2014, 02:31
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(iosifk @ Mar 18 2014, 14:14)  На самом деле есть и более простой вариант... Я бы его назвал скорее АЛЬТЕРНАТИВНЫЙ вариант P.S. Интересный способ
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Mar 19 2014, 09:01
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 10-06-07
Из: Зеленоград
Пользователь №: 28 341

|
Вот так не проще? CODE library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.std_logic_arith.all; USE ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL;
entity main is GENERIC( count_width : INTEGER := 8 );
Port ( clk_in : in STD_LOGIC; f15_1 : in STD_LOGIC_VECTOR(4 DOWNTO 0); fm1 : out STD_LOGIC); end main;
architecture Behavioral of main is
signal count : STD_LOGIC_VECTOR(count_width-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(0, count_width); signal temp_clk_out : STD_LOGIC := '0';
begin
p1: process(clk_in, count) begin if rising_edge(clk_in) then if f15_1 = CONV_STD_LOGIC_VECTOR(0, 5) then temp_clk_out <= clk_in; else if count /= (f15_1-1) then count <= count + '1'; else count <= CONV_STD_LOGIC_VECTOR(0, count_width); end if; if count = CONV_STD_LOGIC_VECTOR(1, count_width) then temp_clk_out <= '1'; else temp_clk_out <= '0'; end if; end if; end if; end process;
fm1 <= temp_clk_out;
end Behavioral;
Сообщение отредактировал Zerg1 - Mar 19 2014, 09:03
|
|
|
|
|
Mar 19 2014, 15:21
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 23-02-14
Пользователь №: 80 654

|
Цитата(Zerg1 @ Mar 19 2014, 13:01)  Вот так не проще? CODE library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.std_logic_arith.all; USE ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL;
entity main is GENERIC( count_width : INTEGER := 8 );
Port ( clk_in : in STD_LOGIC; f15_1 : in STD_LOGIC_VECTOR(4 DOWNTO 0); fm1 : out STD_LOGIC); end main;
architecture Behavioral of main is
signal count : STD_LOGIC_VECTOR(count_width-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(0, count_width); signal temp_clk_out : STD_LOGIC := '0';
begin
p1: process(clk_in, count) begin if rising_edge(clk_in) then if f15_1 = CONV_STD_LOGIC_VECTOR(0, 5) then temp_clk_out <= clk_in; else if count /= (f15_1-1) then count <= count + '1'; else count <= CONV_STD_LOGIC_VECTOR(0, count_width); end if; if count = CONV_STD_LOGIC_VECTOR(1, count_width) then temp_clk_out <= '1'; else temp_clk_out <= '0'; end if; end if; end if; end process;
fm1 <= temp_clk_out;
end Behavioral;
не работает почему-то((((
|
|
|
|
|
Mar 19 2014, 17:51
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 10-06-07
Из: Зеленоград
Пользователь №: 28 341

|
У меня вот что рисует:
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 19 2014, 18:44
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 23-02-14
Пользователь №: 80 654

|
Цитата(Zerg1 @ Mar 19 2014, 21:51)  У меня вот что рисует: Немножко не так: при f15_1=6 получается,что 5 периодов clock_in fm1 принимает значение 0 и всего лишь один период clock_ina. А нужно, чтобы скважность была 50%. 3 периода clock_ina fm1 должно принимать значение '1' и 3 периода значение '0'. Может появится новое решение? Спасибо за советы))
|
|
|
|
|
Mar 20 2014, 04:15
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 10-06-07
Из: Зеленоград
Пользователь №: 28 341

|
Тогда вот так CODE library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.std_logic_arith.all; USE ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL;
entity main is GENERIC( count_width : INTEGER := 8 );
Port ( clk_in : in STD_LOGIC; wr_fm15_1 : in STD_LOGIC; fm15_1 : in STD_LOGIC_VECTOR(4 DOWNTO 0); fm1 : out STD_LOGIC); end main;
architecture Behavioral of main is
signal count : STD_LOGIC_VECTOR(count_width-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(0, count_width); signal temp_clk_out : STD_LOGIC := '0'; signal temp_fm15_1 : STD_LOGIC_VECTOR(4 DOWNTO 0);
begin
p1 : process(wr_fm15_1, count) begin if rising_edge(wr_fm15_1) then temp_fm15_1(4 DOWNTO 0) <= '0' & fm15_1(4 downto 1); end if; end process;
p2 : process(clk_in, count) begin if rising_edge(clk_in) then case conv_integer(temp_fm15_1) is when 0 => temp_clk_out <= clk_in; when 1 => temp_clk_out <= not temp_clk_out; when others => if count /= (temp_fm15_1-1) then count <= count + '1'; else count <= CONV_STD_LOGIC_VECTOR(0, count_width); end if; END CASE; if count = CONV_STD_LOGIC_VECTOR(1, count_width) then temp_clk_out <= not temp_clk_out; end if; end if; end process;
fm1 <= temp_clk_out;
end Behavioral;
Добавился еще один сигнал "wr_fm15_1" по которому происходит смена коэффициента деления. Вот результат:
Сообщение отредактировал Zerg1 - Mar 20 2014, 04:26
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 20 2014, 17:22
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 23-02-14
Пользователь №: 80 654

|
Цитата(gethan @ Mar 17 2014, 19:25)  Всем доброго времени суток! Помогите разобраться с оператором case и делителем частоты. Решил сделать делитель частоты,но такой,чтобы можно было изменять частоту при изменении некоторого 5 разрядного числа, назовем его fm1. Может быть кому-то покажется странным, но вот мое творение для создания меандра: нужно сделать так, чтобы при разных значениях fm1 выбирались разные значения переменной f15_1. Потом исходя из этого через выбранное количество отсчетов фронтов f50k формируются пички, и по ним в следующем процессе делается меандр. CODE frequency1Hz: process (f50k, fm1) variable f15: integer range 0 to 641:=0; variable f15_1: integer range 0 to 641:=0; begin if Clr = '1' then f15_1:=0; f15:=0; freq15<='0'; ELSIF true THEN if rising_edge(f50k) THEN if f15_1 = 0 then case fm1 is -- выбор значений f15_1 при разных значениях fm1 when "00000" => f15_1 := 16; when "00010" => f15_1 := 119; when "00011" => f15_1 := 104; when "00100" => f15_1 := 92; when "00101" => f15_1 := 83; when "00110" => f15_1 := 75; when "10110" => f15_1 := 64; when "00111" => f15_1 := 641; when others => null; end case; end if;
if f15=0 then f15 := f15_1; --присваиваем переменной выбранное значение freq15<='1'; else f15:=f15-1; -- отсчитываем назад до нуля и когда f15 снова станет 0, на длительность такта f50k появляется 1. freq15<='0'; end if; end if; end if; END PROCESS; freq15Hz: process (f50k) --делаем меандр begin if clr='1' then f15<='0';
elsif true then if rising_edge (f50k) then if freq15='1' then if f15='0' then f15<='1';
elsif true then f15<='0'; end if; end if; end if; end if;
end process; Но все это к сожалению не работает. Пытаюсь все это реализовать на АPA300 в Libero. После синтеза и просмотра результата в ModelSim получается вот такая картина(. Подскажите,пожалуйста,где ошибка,что не так, почему не работает! Заранее благодарен)! Может кто-нибудь поможет отыскать ошибку и понять почему именно так не работает?) Пожалуйста))))
Сообщение отредактировал gethan - Mar 20 2014, 17:25
|
|
|
|
|
Mar 23 2014, 13:09
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 23-02-14
Пользователь №: 80 654

|
Написал вот такой код: там два процесса. Сначала делаем один меандр, потом по второму формируем другой. CODE frequancy8khz: process( f2_5) --частота f2_5 ранее сформированная частота из тактовой variable f8k: integer range 0 to 19 := 0; begin IF clr ='1' THEN f8k:=0; ELSIF rising_edge( f2_5 ) THEN IF f8k=0 THEN f8k:=19; else f8k:=f8k-1; end if; IF f8k>9 THEN freq8k<='1'; else freq8k<='0'; end if; end if;
end process;
f8k<=freq8k;
frequency15Hz_10: process (f8k) variable f15_10: integer range 0 to 11 :=0; BEGIN if clr ='1' THEN f15_10:=0; ELSIF rising_edge( f8k ) THEN if f15_10=0 THEN f15_10:=11; else f15_10:=f15_10-1; end if; IF f15_10>6 THEN freq15_10<='1'; else freq15_10<='0'; end if; end if;
END PROCESS;
Два одинаковых процесса,НО!!!! почему-то в одном (в первом процессе для частоты f8k) количество rising_edge(f2_5) считается правильно, т.е. по 10 на нулевое значение и на единичное значение сигнала freq8k. А во втором процессе почему то считает ровно в 2 раза меньше, чем указано. Как так? Помогите понять,почему так!?) На рисунке сигнал dfm1 - это переназванный сигнал f15_10, который должен отсчитывать по 6 rising_edge сигнала f256out1(f8k). Но он отсчитывает только по 3, в два раза меньше,чем надо.(( В чем дело,не пойму! Помогите,пожалуйста!;)
Сообщение отредактировал gethan - Mar 23 2014, 13:10
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 24 2014, 04:29
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(Maverick @ Mar 24 2014, 07:07)  Старая поговорка гласит - "На вкус и цвет товарищей нет" смысл затевать очередной халивар? Это не халивар. Это Глас вопиющего в пустыне. И на меня не надо обращать внимание. Хотите уважительного отношения к своему языку. Пропагандируйте. Учите. Подсказывайте. Вопрошающему. Еще немного и VHDL из действительно качественного языка описания аппаратуры превратится в птичий язык. (Это когда люди не понимают, что делают, используя тот или иной инструмент)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|