реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> помогите с оператором case и делением частоты, не работает(
Dmitriyspb
сообщение Mar 19 2014, 02:31
Сообщение #16


Местный
***

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



Цитата(iosifk @ Mar 18 2014, 14:14) *
На самом деле есть и более простой вариант...


Я бы его назвал скорее АЛЬТЕРНАТИВНЫЙ вариант rolleyes.gif

P.S. Интересный способ


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Zerg1
сообщение Mar 19 2014, 09:01
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
gethan
сообщение Mar 19 2014, 15:21
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 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;

не работает почему-то((((
Go to the top of the page
 
+Quote Post
Zerg1
сообщение Mar 19 2014, 17:51
Сообщение #19


Участник
*

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



У меня вот что рисует:

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
gethan
сообщение Mar 19 2014, 18:44
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 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'. Может появится новое решение? rolleyes.gif
Спасибо за советы))
Go to the top of the page
 
+Quote Post
Zerg1
сообщение Mar 20 2014, 04:15
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
gethan
сообщение Mar 20 2014, 17:22
Сообщение #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
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Mar 21 2014, 02:45
Сообщение #23


Местный
***

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



Цитата(gethan @ Mar 20 2014, 21:22) *
Может кто-нибудь поможет отыскать ошибку и понять почему именно так не работает?) Пожалуйста))))


Запускайте Modelsim и смотрите smile3046.gif


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
gethan
сообщение Mar 23 2014, 13:09
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 24 2014, 03:31
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(gethan @ Mar 23 2014, 16:09) *
Написал вот такой код: там два процесса. Сначала делаем один меандр, потом по второму формируем другой.

Посмотрите в RTL что у Вас получилось.
Если б выложили файлы с тестбенчем, может кто и проанализировал. Как два взаимосвязанных счетчика реализовать.
Ох уж этот VHDL. Пора наверное что то подправить в консерватории.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Mar 24 2014, 04:07
Сообщение #26


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(sazh @ Mar 24 2014, 05:31) *
Ох уж этот VHDL. Пора наверное что то подправить в консерватории.

Старая поговорка гласит - "На вкус и цвет товарищей нет"
смысл затевать очередной халивар?


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 24 2014, 04:29
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Maverick @ Mar 24 2014, 07:07) *
Старая поговорка гласит - "На вкус и цвет товарищей нет"
смысл затевать очередной халивар?



Это не халивар. Это Глас вопиющего в пустыне.
И на меня не надо обращать внимание. Хотите уважительного отношения к своему языку. Пропагандируйте.
Учите. Подсказывайте. Вопрошающему.
Еще немного и VHDL из действительно качественного языка описания аппаратуры превратится в птичий язык.
(Это когда люди не понимают, что делают, используя тот или иной инструмент)
Go to the top of the page
 
+Quote Post
Maverick
сообщение Mar 24 2014, 04:34
Сообщение #28


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(sazh @ Mar 24 2014, 06:29) *
Это не халивар. Это Глас вопиющего в пустыне.
...Хотите уважительного отношения к своему языку. Пропагандируйте.

пропаганды я не вел, не веду и не буду вести. Я не вижу в этом смысла...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 24 2014, 06:06
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(gethan @ Mar 23 2014, 17:09) *
Написал вот такой код
Извините, но читать ваш адски отформатированный код нет никакого желания. Если вас это форматирование устраивает, то ради бога. Но если вы хотите, чтобы вам помогли, начните с элементарного: сделайте код выглядящим нормально. Как говорится, "макет должен быть красивым, а не соответствовать местности".
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016