Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разное (электроника) > VHDL


Автор: darkniisiis 13.10.2006, 15:02
Вот такой вопрос-недавно начал программировать на VHDL под XILINX, возникают некоторые вопросы.На этом форуме вообще есть кто-нибудь,кто в этом шарит?Я пытался поднимать вопросы в других темах-тишина и покой, посоветовали спросить  здесь. Вот пришёл к вам покричать "АУУУУУУУУУУ!ЕСТЬ КТО ЖИВОЙ?"
Отзовитесь!!!

Автор: Romikgy 13.10.2006, 15:39
Цитата(darkniisiis @  13.10.2006,  14:02 Найти цитируемый пост)
Вот пришёл к вам покричать "АУУУУУУУУУУ!ЕСТЬ КТО ЖИВОЙ?"
Отзовитесь!!! 

ты делой это без криков!

Где вопрос то?

PS еще раз правила можешь на досуге почитать!

Автор: darkniisiis 16.10.2006, 10:07
Я просто задал вопрос, есть ли на этом форуме компитентные люди, разбирающиеся в VHDL, а коли таких нет смысл вопросы то задавать?

Ну на всякий случай, вдруг кто забредёт вопрос таков
Помогите описать на VHDL под xilinx(среда разработки ISE 8.2i sp1) таймер задержки, третий день голову ломаю всё никак промоделировать не получается.
Начало вот:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity del_clk is
Port ( set : in STD_LOGIC;
out_clk : out STD_LOGIC;
clk : in STD_LOGIC;
prog : in STD_LOGIC_VECTOR (15 downto 0));
end del_clk;
где set-вход для импульса,который должен появиться на выходе out_clk через задержку в несколько тактовых импульсов,подаваемых на вход clk, количество этих импульсов задаётся через вход prog.
СПАСИТЕ МОЮ БЕДНУЮ ГОЛОВУ!!!! 



Автор: Romikgy 16.10.2006, 13:08
Цитата(darkniisiis @  16.10.2006,  09:07 Найти цитируемый пост)
Я просто задал вопрос, есть ли на этом форуме компитентные люди, разбирающиеся в VHDL, а коли таких нет смысл вопросы то задавать?

так зачем создавать тему если в ней нет вопроса?
терь вопрос задан и кто знает тот те ответит

Автор: Romikgy 16.10.2006, 16:38
Воть те ссылки может будут полезны
http://www.kvantn.com.ua/resourse/All/VHDL/VHDL_context.html
http://electronix.ru/forum/
http://www.opencores.org/

Автор: darkniisiis 17.10.2006, 10:51
Помогите найти ошибку.Вот рабочий таймер, только сигнал на выходе при prog="0000000000000001" возникает не через один такт, а через два. 
---------------------------------------Листинг----------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity del_clk is
    Port ( set : in  STD_LOGIC;
           out_clk : out  STD_LOGIC;
              clk : in STD_LOGIC;
           prog : in STD_LOGIC_VECTOR (15 downto 0));
end del_clk;

architecture Behavioral of del_clk is
signal st : STD_LOGIC_VECTOR (15 downto 0):="0000000000000000";
signal outsig : STD_LOGIC:='0';
signal setup : STD_LOGIC:='0';
begin
process(set,outsig)
variable crt : integer:=0;
begin
if set='1' then
crt := crt + 1;
end if;
if outsig = '1' then
crt := crt - 1;
end if;
if crt=0 then
setup<='0';
else
setup<='1';
end if;
end process;
process(clk)
begin
if setup='1' then
if clk='1' then
if (prog="0000000000000001" and st/="0000000000000001") then
st<=st+1;
elsif (prog="0000000000000001" and st=prog) then
st<= conv_std_logic_vector(0,16);
elsif (st=prog-1 and prog/="0000000000000001") then
st<= conv_std_logic_vector(0,16);
else st<=st+1;
end if;
end if;
end if;
if (prog="0000000000000001" and st=prog and clk='1') then 
out_clk <= '1';
outsig <= '1';
elsif (st=prog-1 and clk='1' and prog/="0000000000000001") then 
out_clk <= '1';
outsig <= '1';
else 
out_clk <= '0';
outsig <= '0';
end if;

end process;
end Behavioral;


Автор: Romikgy 17.10.2006, 11:09
Это не мой ответ , а спеца который хавает в этом
Код

у тебя асинхронный процесс перелазит в синхронный
так как асинхронный тайминги зависит от расположение в микросхемы от 
типа микросхемы он может быть быстрее клока но и медленне клока
надо знать микруху и выстроить временную диаграмму процесса


Автор: darkniisiis 19.10.2006, 10:33
Да вообще таймер какой-то корявый получился, при трансляции куча варнингов.Помогите кто-нибудь его до ума довести, или предложите свой вариант, а то у меня фантазия закончилась, а время уже поджимает. Буду примногоблагодарен,HELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Разрабатывается под ПЛИС Xilinx Spartan2 .

Автор: srm 15.4.2010, 17:04
Может у кого есть реализованный на VHDL алгоритм Штрассена. Очень нужен. 

Автор: Evgenij118 27.1.2011, 22:48
Кто знает, напишите пожалуйста, как занести в 15-ую ячейку памити ОЗУ значение 21. И 

вывести занчение 27-ой ячейки. И это всё через Test Bench. Заранее спасибо!

Автор: abraziv 10.12.2012, 11:12
Всем привет. Почему  тип std_logic в объявление интерфейса можно использовать  только один раз?? Т.е. если объявить следом ещё один интерфейс (entity) то анализатор-VHDL ругается: 

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
entity DFF is
    Port  ( D     :   in  std_logic;
           CLK    :   in  std_logic;
           RESET  :   in  std_logic;
           Q      :   out  std_logic
              );
end DFF;

entity D is
    Port  ( DATA    :   in  std_logic);
end D;

Если же повторно прописать библиотеку, ошибка уходит, с чем это связано???

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
entity DFF is
    Port  ( D     :   in  std_logic;
           CLK    :   in  std_logic;
           RESET  :   in  std_logic;
           Q      :   out  std_logic
              );
end DFF;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

entity D is
    Port  ( DATA    :   in  std_logic);
end D;

Автор: abraziv 7.9.2013, 16:54
Всем привет. Почему то во время синтеза, XST вылитает с ошибкой , если раскомментировать строчку s_clk_out <= not s_clk_out  :
Подскажите пожалуйста как исправить.

Код


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clk_adc_x_2 is
port(
clk_adc : in std_logic;
clk_out : out std_logic;
sys_clk : in std_logic
);
end clk_adc_x_2;

architecture Behavioral of clk_adc_x_2 is

signal r_edge : std_logic;
signal f_edge1 : std_logic;
signal resolved : std_logic;
signal s_clk_out : std_logic;
signal start :  std_logic;

begin

p1 : process( clk_adc )
variable stop : integer := 0;
begin
if stop < 1 then
    if clk_adc = '1' then
    r_edge <= '1';
    else
    f_edge1 <= '1';
    r_edge <= '0';
    stop :=  stop + 1 ;
    end if;
end if;
start <= not start;
end process;

p2 : process
variable i    : integer := 0;
variable N    : integer := 0;
variable j1,j2    : integer := 0;
variable f_edge2 : integer := 0;
begin
wait until rising_edge( sys_clk ) ;
if f_edge2 < 1 then
    if r_edge = '1' then
    i := i + 1;
        elsif f_edge1 = '1' then
        N := i / 2;
        f_edge2 := f_edge2 + 1;
    end if;
else
        if start = '1' then
            j2 := N;
            if j1 = N then
            s_clk_out <= not s_clk_out;
            j1 := 0;
            else
            j1 := j1 + 1;
            end if;
        else
            j1 := N;
            if j2 = N then
            --s_clk_out <= not s_clk_out;
            j2 := 0;
            else
            j2 := j2 + 1;
            end if;
        end if;        
end if;
end process;

clk_out <= s_clk_out;

end Behavioral;


Автор: lait33 20.10.2015, 21:44
Цитата(abraziv @ 7.9.2013,  16:54)
Всем привет. Почему то во время синтеза, XST вылитает с ошибкой , если раскомментировать строчку s_clk_out <= not s_clk_out  :
Подскажите пожалуйста как исправить.

Код


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clk_adc_x_2 is
port(
clk_adc : in std_logic;
clk_out : out std_logic;
sys_clk : in std_logic
);
end clk_adc_x_2;

architecture Behavioral of clk_adc_x_2 is

signal r_edge : std_logic;
signal f_edge1 : std_logic;
signal resolved : std_logic;
signal s_clk_out : std_logic;
signal start :  std_logic;

begin

p1 : process( clk_adc )
variable stop : integer := 0;
begin
if stop < 1 then
    if clk_adc = '1' then
    r_edge <= '1';
    else
    f_edge1 <= '1';
    r_edge <= '0';
    stop :=  stop + 1 ;
    end if;
end if;
start <= not start;
end process;

p2 : process
variable i    : integer := 0;
variable N    : integer := 0;
variable j1,j2    : integer := 0;
variable f_edge2 : integer := 0;
begin
wait until rising_edge( sys_clk ) ;
if f_edge2 < 1 then
    if r_edge = '1' then
    i := i + 1;
        elsif f_edge1 = '1' then
        N := i / 2;
        f_edge2 := f_edge2 + 1;
    end if;
else
        if start = '1' then
            j2 := N;
            if j1 = N then
            s_clk_out <= not s_clk_out;
            j1 := 0;
            else
            j1 := j1 + 1;
            end if;
        else
            j1 := N;
            if j2 = N then
            --s_clk_out <= not s_clk_out;
            j2 := 0;
            else
            j2 := j2 + 1;
            end if;
        end if;        
end if;
end process;

clk_out <= s_clk_out;

end Behavioral;



все. теперь компилится=) 

процесс всегда должен быть тактируемым это раз и быть в списке чувствительности.  

всякие wait в железе не работают.. т.к это не синтезируемые типы данных. они толкьо для симуляций. 
хоть оп умолчанию изначально сигналу присваивается 0, но лучше это делать самому.. дабы избежать всяких глюков

ну и некоторые переменные вынес в сигналы, хотя это никак не повлияло бы на ту ошибку. 

Код

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity clk_adc_x_2 is
port(
clk_adc : in std_logic;
clk_out : out std_logic;
sys_clk : in std_logic
);
end clk_adc_x_2;
architecture Behavioral of clk_adc_x_2 is
signal r_edge        : std_logic;
signal f_edge1        : std_logic;
signal resolved    : std_logic;
signal s_clk_out    : std_logic := '0';
signal start        : std_logic := '0';

signal stop        : std_logic_vector(2 downto 0) := (others => '0');    
signal f_edge2        : std_logic_vector(2 downto 0) := (others => '0');    

begin

p1 : process(clk_adc)
begin
if rising_edge(clk_adc) then 
    if stop < 1 then
        r_edge <= '1';
        else
        f_edge1 <= '1';
        r_edge <= '0';
        stop <=  stop + '1';
    end if;
end if;
end process p1;

start <= not start;

p2 : process( sys_clk )
variable i    : integer := 0;
variable N    : integer := 0;
variable j1,j2    : integer := 0;
begin
        if rising_edge( sys_clk ) then
            if f_edge2 < 1 then
                if r_edge = '1' then
                    i := i + 1;
                elsif f_edge1 = '1' then
                    N := i / 2;
                    f_edge2 <=  f_edge2 + '1';
                end if;

            else
              if start = '1' then
                    j2 := N;
                    if j1 = N then
                        s_clk_out <= not s_clk_out;
                        j1 := 0;
                        else
                            j1 := j1 + 1;
                    end if;
              else
              
                if start = '0' then
                    j1 := N;
                    if j2 = N then
                        s_clk_out <= not s_clk_out;
                        j2 := 0;
                        else
                        j2 := j2 + 1;
                    end if;
                end if;    
              end if;        
            end if;
        end if;
end process p2;
clk_out <= s_clk_out;
end Behavioral;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)