Нужен совет впециалиста по VHDL. Вроде как позволяется создавать свои списки. Но мне чего-то не удается сделать это. Допустим, простая задача: хочу сделать счетчик, который проходит следующие состояния: "11", "01", "10". Вот код который я попытался накропать читая учебник, но он не компилируется. Утверждает, что слову 'type' там не место. Конечно присваивание следующего значения - тоже сомниваюсь, что так можно делать. скорее должно быть что-то вроде инкремента переменной индекса массива и затем выбор элемента массива, но и на строчку variable i : integer; - компилятор тоже ругается, что "так можно делать только для SHARE переменных".
Код:
entity counter is Port(clk in: std_logic; count out : std_logic_vector); end counter;
architecture Behavioral of counter is type thd is ("11", "01","10"); type thd_array is array (integer range <>) of thd; signal count_signal : std logic_vector (1 downto 0) := thd_array(0);
begin process(clk) begin if clk'event and clk='1' then count_signal <= count_signal+1; end if; end process; count <= count_signal; end Behavioral;
Покажите образец как такие вещи писать.
p.s. Таблицы перекодировки, pls, не предлагать. Интересует именно использование выразительных средств языка.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Проблема не в этом. Это я не внимательно переписывал с другого монитора. Ну пусть там будет (1 downto 0). Сама суть заставить схему проходить состояния в заданной последовательности. Независимо вычислимые или невычислимые. Просто хочется задать таблицу. И не хочется писать длинный case.
Да, спасибо, очевидно только так это можно организовать. Наверное применение перечислимого типа здесь неуместно. Хотелось написать список, чтобы бегать по нему в любом направлении, не создавая две таблицы переходов.
Статью для Кота ;-). Я, наверное, перманентный начинающий. Надоело, что редактор схем грохается от каждого неосторожного шага и решил осваивать текстовые языки. Хотел начать с ABEL (на xilinx был сервис - заливаешь код, он в ответ .jed), но пока искал учебники убрали его поддержку за невостребованностью. Теперь вот пытаюсь VHDL освоить. Есть четыре учебника - да толку мало.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Я сначала в схематике пытался, но потом начал комбинировать, так показалось проще, например описываешь элемент, а затем создаешь его компонент. Мне тоже сложновато языки даются...Если будут вопросы пиши, попытаюсь помочь, вдвоем проще разобраться) Кстати вот хочу попробовать щас часики на CPLD сделать, так от делать нечего) как раз и в языке продвинусь (надеюсь)
Кстати вот хочу попробовать щас часики на CPLD сделать, так от делать нечего) как раз и в языке продвинусь :) (надеюсь)
Вот их я и сделал ;-). В двух вариантах на ЖКИ и ИН-14. Правда для ЖКИ на xc9572 - т.е. не для батарейного питания. Сейчас пытаюсь забороть CoolrunnerII. но он не для наколенного монтажа. Нашел самую "растопыристую" микросхему из coolrunner-ов xc2c64a - в VQFP корпусе шаг 0.8 мм - все остальные 0.5. И пытался упхнуть часики. Вроде всего на 8 макроячеек меньше, но даже выбросив 10-разрядный делитель частоты всё-равно нехватает. Как-то он по другому организован, надо по-внимательнее даташит поизучать. Сейчас уговорил её на тактовую 8Гц с использованием фичи DualEdge. Потому что тактировать решил от cd4060, а у нее в делителе как раз дырка - на 16Гц нету вывода. 32Гц делить - ячеек нехватает, а 8Гц - вроде уже дискретизация будет нервировать. Теперь нужно будет подумать плату и на живом уже проверять. Посмотрим, действительно ли там будут микроамперы потребляемого тока...
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Когда-то наш руководитель кружка рассказывал об одном человеке, который публиковал конструкции в журнале Радио. И всегда это была одна и та же конструкция - "Красный или зелёный". Вроде на тот момент последняя была на микросхемах 155-й серии. А первая, говорят, была на лампах.
nick17 писал(а):
Дааа, я вчера уже понял, после того как зашел на твой сайт, что часики уже одно из пройденных у тебя)) FPGA планируешь?))
Просто, когда осваиваешь что-то новое, пробуешь применить в уже известном. Вот у меня это часы и таймеры. А для FPGA не могу придумать пока достойной задачи. Потому как туда надо софт заливать. Значит нужен микроконтроллер. И микроконтроллер с памятью. Есть у меня пара платок-доноров с каким-то малым Spartan-ом. Но он тоже 0.5 мм TQFP.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
entity test is Port ( clk : in STD_LOGIC; count : out STD_LOGIC_VECTOR (1 downto 0)); end test;
architecture Behavioral of test is type thd_table is array(integer range <>) of std_logic_vector(1 downto 0); constant thd : thd_table:= (0 => "11", 1 => "01", 2 => "10"); signal thd_ptr : integer range 0 to thd'HIGH:= 0; signal data_out : std_logic_vector(1 downto 0);
begin process(clk) begin if clk'event and clk='1' then if thd_ptr = thd'HIGH then thd_ptr <= 0; else thd_ptr <= thd_ptr + 1; End if; data_out <= thd(thd_ptr); end if; end process;
count <= data_out;
end Behavioral;
Разумеется, суть не в двух разрядах, а в использовании типов и построении последовательностей.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
entity test is
Port ( clk : in STD_LOGIC;
count : out STD_LOGIC_VECTOR (1 downto 0));
end test;
architecture Behavioral of test is
type thd_table is array(integer range <>) of
std_logic_vector(1 downto 0);
constant thd : thd_table:= (0 => "11",
1 => "01",
2 => "10");
signal thd_ptr : integer range 0 to thd'HIGH:= 0;
--signal data_out : std_logic_vector(1 downto 0);
begin
process(clk)
begin
if clk'event and clk='1' then
if thd_ptr = thd'HIGH then
thd_ptr <= 0;
else
thd_ptr <= thd_ptr + 1;
End if;
--data_out <= thd(thd_ptr);
end if;
end process;
У меня есть еще вопрос. Сделал пол-года назад проект - всё работает. Одно но - исходник содержит полторы тысячи строк. Нельзя ли как "уплотнить"? Дело в том, что куски однообразные. Здесь написана работа с устройством 1-wire. Модулю посылаются сигналы что передавать сброс, "1" или "0", а затем ожидается пока слот отработает, потом следующий бит. Беда в том, что сигнал state проходит почти все 256 состояний и в этом case каждое состояние расписать муторно. А еще муторнее это читать. Можно ли как-то объединить их циклом, что-ли? Спойлер
Код:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. library UNISIM; use UNISIM.VComponents.all;
entity thermo is Port ( clk1mhz : in STD_LOGIC; owin1 : in STD_LOGIC; owin2 : in STD_LOGIC; owout : out STD_LOGIC; spullup: out STD_LOGIC; crcerr1: out STD_LOGIC; crcerr2: out STD_LOGIC; cathodes : out STD_LOGIC_VECTOR (3 downto 0); anodes : out STD_LOGIC_VECTOR (1 downto 0)); end thermo;
architecture Behavioral of thermo is
signal clk : std_logic := '0'; signal datain1 : std_logic := '0'; signal datain2 : std_logic := '0'; signal dataout : std_logic := '0'; signal wr_res : std_logic :='0'; signal ow_run : std_logic := '0'; signal crc_upd : std_logic :='0'; signal tsh_upd : std_logic_vector (1 downto 0) :="00"; signal state : std_logic_vector (7 downto 0) := (others => '0');
-- Make reset case state is when X"00" => spullup <= '1'; wr_res <= '0'; ow_run <= '1'; state <= state+1;
when X"01" => if ow_run = '0' then state <= state+1; end if; -- Send 0x33 - Read ROM when X"02" => dataout <= Read_ROM(0); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"03" => if ow_run = '0' then state <= state+1; end if;
when X"04" => dataout <= Read_ROM(1); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"05" => if ow_run = '0' then state <= state+1; end if;
when X"06" => dataout <= Read_ROM(2); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"07" => if ow_run = '0' then state <= state+1; end if;
when X"08" => dataout <= Read_ROM(3); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"09" => if ow_run = '0' then state <= state+1; end if;
when X"0A" => dataout <= Read_ROM(4); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"0B" => if ow_run = '0' then state <= state+1; end if;
when X"0C" => dataout <= Read_ROM(5); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"0D" => if ow_run = '0' then state <= state+1; end if;
when X"0E" => dataout <= Read_ROM(6); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"0F" => if ow_run = '0' then state <= state+1; end if;
when X"10" => dataout <= Read_ROM(7); wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"11" => if ow_run = '0' then state <= state+1; end if;
-- Read 4 bit of family code: -- ds18b20 0x28 0001..., -- ds18s20 0x10 0000... when X"12" => dataout <= '1'; wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"13" => if ow_run = '0' then state <= state+1; end if;
when X"14" => dataout <= '1'; wr_res <= '1'; ow_run <= '1'; state <= state+1;
when X"15" => if ow_run = '0' then state <= state+1; end if; и так далее...
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения