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

 
 
> помогите с оператором case и делением частоты, не работает(
gethan
сообщение Mar 17 2014, 15:25
Сообщение #1


Участник
*

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



Всем доброго времени суток!
Помогите разобраться с оператором case и делителем частоты. Решил сделать делитель частоты,но такой,чтобы можно было изменять частоту при изменении некоторого 5 разрядного числа, назовем его fm1.

Может быть кому-то покажется странным, но вот мое творение для создания меандра:
нужно сделать так, чтобы при разных значениях fm1 выбирались разные значения переменной f15_1. Потом исходя из этого через выбранное количество отсчетов фронтов f50k формируются пички, и по ним в следующем процессе делается меандр.
Код
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 получается вот такая картина(.

Подскажите,пожалуйста,где ошибка,что не так, почему не работает!

Заранее благодарен)!
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
cerg19
сообщение Mar 18 2014, 01:43
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 12-05-09
Из: Нижний Новгород
Пользователь №: 48 978



с читабельным форматированием это значит примерно вот так:

CODE
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
LIBRARY IEEE;
USE IEEE.std_logic_unsigned.all;
use IEEE.STD_LOGIC_ARITH.ALL;


ENTITY SinTR IS
GENERIC(
koef : INTEGER := 2 --:= 3 --:= 1
);

PORT (
TAKT : in std_logic;
strob : in std_logic;
sdvig : in std_logic;
data_serial : in std_logic;
Clr : in std_logic;

fout : out std_logic;
Dfm : out std_logic;
fmod_out : out std_logic_vector (4 downto 0)
);

END SinTR;

ARCHITECTURE beh OF SinTR IS

signal fm1 : std_logic_vector (4 downto 0) := ( others => '0' );
signal ff256 : std_logic_vector (3 downto 0);
signal freq2_5_1, f2_5, freq15, f15, f50k, freq50k, fm256, fm :std_logic := '0';
signal rs_s1, rs_s : std_logic_vector (41 downto 0):= (others => '0');

BEGIN
--
-- << TAKT >> == 15 MHz
--сначала делаем меандр до частоты 2,5 MHz, из него формируем уже частоту f50k (50 kHz)
frequency2_5MHz: process (TAKT)
variable f1: integer range 0 to koef :=0;
begin
if Clr = '1' then
f1 := 0;
freq2_5_1<='0';
ELSIF true THEN
IF rising_edge(TAKT) THEN
IF f1 = 0 THEN
f1:=koef;
freq2_5_1<='1';
ELSIF true THEN
f1:=f1-1;
freq2_5_1<='0';
END IF;
END IF;
END IF;
END PROCESS;

freq2_5MHz: process (TAKT)
begin
if clr='1' then
f2_5<='0';

elsif true then
if rising_edge (TAKT) then
if freq2_5_1='1' then
if f2_5='0' then
f2_5<='1';

elsif true then
f2_5<='0';
end if;
end if;
end if;
end if;

end process;
-- делаем частоту f50k
frequency50kHz: process (f2_5)
variable f50k: integer range 0 to 25:=0;
begin
if Clr = '1' then
f50k := 0;

freq50k<='0';
ELSIF true THEN
IF rising_edge(f2_5) THEN
IF f50k = 0 THEN
f50k:=25;
freq50k<='1';
ELSIF true THEN
f50k:=f50k-1;
freq50k<='0';
END IF;
END IF;
END IF;
END PROCESS;

freq50kHz: process (f2_5)
begin
if clr='1' then
f50k<='0';

elsif true then
if rising_edge (f2_5) then
if freq50k='1' then
if f50k='0' then
f50k<='1';

elsif true then
f50k<='0';
end if;
end if;
end if;
end if;

end process;

Fout <= f50k;-- сигнал подаем на выходной порт

frequency1Hz: process (f50k, fm1) -- формируем частоту по тому же принципу, что и f50k, но добавляем case видимо как-то неправильно((
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
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;
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;


fm <= f15; --перезаписываем сигнал
Dfm <= fm; --на выходной порт
-----------дальше для загрузки fm1
mr1_1 : PROCESS ( strob )
BEGIN
IF rising_edge(strob) THEN
fm1<=rs_s1( 4 downto 0 );
END IF;
END PROCESS;


fmod_out<=fm1;

msdvig : PROCESS ( sdvig )
BEGIN
IF rising_edge(sdvig) THEN
rs_s(41 downto 1)<=rs_s(40 downto 0);
rs_s(0)<=data_serial;
end if;
end process;

process (takt,clr,rs_s1)
begin
if clr = '1' then
rs_s1 <=( others => '0' );
elsif (takt'event and takt = '1') then
rs_s1(41 downto 0) <= rs_s(41 downto 0);
end if;
end process;
END beh;


не ленитесь делать код читаемым.

Что касается самой проблемы, то возможно её решение в процессе mr1_1
Код
BEGIN
    IF rising_edge(strob) THEN
        fm1<=rs_s1( 4 downto 0 );
    END IF;
END PROCESS;


fm1 загружается не синхронно относительно тактовой частоты f50k. Попробуйте так:
Код
    mr1_1 : PROCESS (f50k)
    BEGIN
        IF rising_edge(f50k) THEN
            if strob = '1' then
                fm1<=rs_s1( 4 downto 0 );
            end if;
        END IF;
    END PROCESS;

при этом сигнал strob импульсный длительностью в 1 такт клока f50k

Сообщение отредактировал des00 - Mar 19 2014, 03:35
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- gethan   помогите с оператором case и делением частоты   Mar 17 2014, 15:25
- - cerg19   Если честно не совсем понял где сигнал fm управляе...   Mar 17 2014, 15:47
|- - gethan   Цитата(cerg19 @ Mar 17 2014, 19:47) Если ...   Mar 17 2014, 16:05
|- - gethan   Цитата(cerg19 @ Mar 17 2014, 19:47) Если ...   Mar 17 2014, 17:19
- - tdocs.su   Цитата(gethan @ Mar 17 2014, 19:25) Всем ...   Mar 17 2014, 15:48
|- - gethan   Цитата(cerg19 @ Mar 18 2014, 05:43) с чит...   Mar 18 2014, 02:14
|- - Zerg1   Вот так не проще? CODE library IEEE; use IEEE.STD...   Mar 19 2014, 09:01
|- - gethan   Цитата(Zerg1 @ Mar 19 2014, 13:01) Вот та...   Mar 19 2014, 15:21
|- - Zerg1   У меня вот что рисует:   Mar 19 2014, 17:51
|- - gethan   Цитата(Zerg1 @ Mar 19 2014, 21:51) У меня...   Mar 19 2014, 18:44
- - Dmitriyspb   Цитата(gethan @ Mar 17 2014, 19:25) Всем ...   Mar 18 2014, 02:37
|- - gethan   Цитата(Dmitriyspb @ Mar 18 2014, 06:37) П...   Mar 18 2014, 04:24
|- - Dmitriyspb   Цитата(gethan @ Mar 18 2014, 08:24) Спаси...   Mar 18 2014, 04:47
|- - gethan   Цитата(Dmitriyspb @ Mar 18 2014, 08:47) А...   Mar 18 2014, 05:42
|- - Dmitriyspb   Цитата(gethan @ Mar 18 2014, 09:33) Я так...   Mar 18 2014, 05:44
||- - gethan   Цитата(Dmitriyspb @ Mar 18 2014, 09:44) Т...   Mar 18 2014, 07:00
||- - iosifk   Цитата(gethan @ Mar 18 2014, 11:00) Подел...   Mar 18 2014, 10:14
||- - Dmitriyspb   Цитата(iosifk @ Mar 18 2014, 14:14) На са...   Mar 19 2014, 02:31
|- - sazh   Цитата(gethan @ Mar 18 2014, 08:42) Пытаю...   Mar 18 2014, 06:09
- - Zerg1   Тогда вот так CODE library IEEE; use IEEE.STD_LOGI...   Mar 20 2014, 04:15
- - gethan   Цитата(gethan @ Mar 17 2014, 19:25) Всем ...   Mar 20 2014, 17:22
|- - Dmitriyspb   Цитата(gethan @ Mar 20 2014, 21:22) Может...   Mar 21 2014, 02:45
- - gethan   Написал вот такой код: там два процесса. Сначала д...   Mar 23 2014, 13:09
- - sazh   Цитата(gethan @ Mar 23 2014, 16:09) Напис...   Mar 24 2014, 03:31
|- - Maverick   Цитата(sazh @ Mar 24 2014, 05:31) Ох уж э...   Mar 24 2014, 04:07
|- - sazh   Цитата(Maverick @ Mar 24 2014, 07:07) Ста...   Mar 24 2014, 04:29
|- - Maverick   Цитата(sazh @ Mar 24 2014, 06:29) Это не ...   Mar 24 2014, 04:34
- - andrew_b   Цитата(gethan @ Mar 23 2014, 17:09) Напис...   Mar 24 2014, 06:06


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

 


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


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