darkniisiis 0 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Подскажите эквивалент верилоговскому wire для VHDL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klop 0 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Подскажите эквивалент верилоговскому wire для VHDL signal А про два квадрата ето круто. Напоминет извесный анекдот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба В графическом редакторе какого пакета реализована эта схема. Если это продукт альтеры, готов посмотреть и сказать свое мяу. Если это XILINX. То пас. iSE у меня нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 30 октября, 2006 Опубликовано 30 октября, 2006 (изменено) · Жалоба И по счастливому стечению обстоятельств это именно XILNX и именно ISE 8.2i :) И чем вы думаете я сейчас занимаюсь? Изучаю ВЕРИЛОГ. Кстати он безусловно удобнее VHDL, но его главный минус в том, что он не сертифицирован в России. module abc ( input clk, input clk2x, input [15:0] divider_param, input [15:0] shifter_param, output set_clk, output out_clk ); wire out; reg [15:0] r_divider = 0; reg [15:0] r_divider_counter = 0; reg [15:0] r_shifter = 0; reg r_shifter_counter_reset = 0; reg r_shifter_counter_reset_r0 = 0; reg [15:0] r_shifter_counter = 0; reg [15:0] r_shifter_startup_timer = 0; reg r_out = 0; reg r_set = 0; reg r_divider_new = 0; reg r_shifter_new = 0; assign set_clk = (divider_param == 0) ? clk : r_set; assign out_clk = (divider_param == 0) ? clk : out; assign out = (shifter_param == 0) ? r_set : r_out; always @(posedge clk2x) begin if (r_divider != divider_param) begin r_divider <= divider_param; r_divider_new <= 1'b1; end else begin r_divider_new <= 1'b0; end end always @(posedge clk2x) begin if (r_shifter != shifter_param) begin r_shifter <= shifter_param; r_shifter_new <= 1'b1; end else begin r_shifter_new <= 1'b0; end end always @(posedge clk2x) begin if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1)) begin r_divider_counter <= r_divider; end else if (r_divider_counter == r_divider) begin r_divider_counter <= 16'b0; end else begin r_divider_counter <= r_divider_counter + 1; end end always @(posedge clk2x) begin if ((r_shifter_counter_reset == 1'b1) || (r_shifter_counter_reset_r0 == 1'b1)) begin r_shifter_counter <= 17'b0; end else if (r_shifter_counter == r_divider) begin r_shifter_counter <= 17'b0; end else begin r_shifter_counter <= r_shifter_counter + 1; end end always @(posedge clk2x) begin if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1)) begin r_set <= 1'b0; end else if (r_divider_counter == 16'b0) begin r_set <= ~r_set; end end always @(posedge clk) begin if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1)) begin r_shifter_counter_reset <= 1'b1; r_shifter_startup_timer <= 16'd1; end else if (r_shifter_startup_timer != r_shifter) begin r_shifter_startup_timer <= r_shifter_startup_timer + 1; end else if (r_shifter_startup_timer == r_shifter) begin r_shifter_counter_reset <= 1'b0; end end always @(posedge clk2x) begin r_shifter_counter_reset_r0 <= r_shifter_counter_reset; end always @(posedge clk2x) begin if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1)) begin r_out <= 1'b0; end else if (r_shifter_counter == 0) begin r_out <= ~r_out; end end endmodule люди добрые, проверьте меня пожалуста, перевод удался? verilog2VHDL library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity PEREVOD_VERILOG is Port ( clk : in STD_LOGIC; clk2x : in STD_LOGIC; divider_param : in STD_LOGIC_VECTOR (15 downto 0); shifter_param : in STD_LOGIC_VECTOR (15 downto 0); set_clk : out STD_LOGIC; out_clk : out STD_LOGIC); end PEREVOD_VERILOG; architecture Behavioral of PEREVOD_VERILOG is signal out1 : STD_LOGIC; signal r_divider : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000"; signal r_divider_counter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000"; signal r_shifter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000"; signal r_shifter_counter_reset : STD_LOGIC:= '0'; signal r_shifter_counter_reset_r0 : STD_LOGIC:= '0'; signal r_shifter_counter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000"; signal r_shifter_startup_timer : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000"; signal r_out : STD_LOGIC:= '0'; signal r_set : STD_LOGIC:= '0'; signal r_divider_new : STD_LOGIC:= '0'; signal r_shifter_new : STD_LOGIC:= '0'; begin set_clk <= clk when divider_param = "0000000000000000" else r_set; out_clk <= clk when divider_param = "0000000000000000" else out1; out1 <= r_set when shifter_param = "0000000000000000" else r_out; process(clk2x) begin if(clk2x='1' and clk2x'event) then if (r_divider /= divider_param) then r_divider <= divider_param; r_divider_new <= '1'; else r_divider_new <= '0'; end if; end if; end process; process(clk2x) begin if(clk2x='1' and clk2x'event) then if (r_shifter /= shifter_param) then r_shifter <= shifter_param; r_shifter_new <= '1'; else r_shifter_new <= '0'; end if; end if; end process; process(clk2x) begin if(clk2x='1' and clk2x'event) then if ((r_divider_new = '1') or (r_shifter_new = '1')) then r_divider_counter <= r_divider; elsif (r_divider_counter = r_divider) then r_divider_counter <= "0000000000000000"; else r_divider_counter <= r_divider_counter + 1; end if; end if; end process; process(clk2x) begin if(clk2x='1' and clk2x'event) then if ((r_shifter_counter_reset = '1') or (r_shifter_counter_reset_r0 = '1')) then r_shifter_counter <= "0000000000000000"; elsif (r_shifter_counter = r_divider) then r_shifter_counter <= "0000000000000000"; else r_shifter_counter <= r_shifter_counter + 1; end if; end if; end process; process(clk2x) begin if (clk2x='1' and clk2x'event) then if ((r_divider_new = '1') or (r_shifter_new = '1')) then r_set <= '1'; elsif (r_divider_counter = "0000000000000000") then r_set <= not r_set; end if; end if; end process; process(clk) begin if (clk='1' and clk'event) then if ((r_divider_new = '1') or (r_shifter_new = '1')) then r_shifter_counter_reset <= '1'; r_shifter_startup_timer <= "1111111111111111"; elsif (r_shifter_startup_timer /= r_shifter) then r_shifter_startup_timer <= r_shifter_startup_timer + 1; elsif (r_shifter_startup_timer = r_shifter) then r_shifter_counter_reset <= '0'; end if; end if; end process; process(clk2x) begin if (clk2x='1' and clk2x'event) then r_shifter_counter_reset_r0 <= r_shifter_counter_reset; end if; end process; process(clk2x) begin if (clk2x='1' and clk2x'event) then if ((r_divider_new ='1') or (r_shifter_new = '1')) then r_out <= '0'; elsif (r_shifter_counter = 0) then r_out <= not r_out; end if; end if; end process; end Behavioral; Изменено 30 октября, 2006 пользователем darkniisiis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 30 октября, 2006 Опубликовано 30 октября, 2006 (изменено) · Жалоба Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта (см ). В общем опять не то получилось. Изменено 30 октября, 2006 пользователем darkniisiis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Уважаемый, darkniisiis, пишу это не чтобы лишний раз поглумиться, Боже упаси. Поймите для себя раз и навсегда, что написание синтезируемых конструкций для ПЛИС (в отличие от тестбенчей) на VHDL, Verilog, да и на чем угодно другом, мало имеет общего с программированием. Задача здесь в другом - с помощью набора известных синтаксических конструкций языка составить описание схемы, состоящей из тех же триггеров, счетчиков, автоматов и т.п., причем так, чтобы синтезатор Вас правильно понял и вписал все, что Вы хотите, (и именно так, как Вы хотите) в прокрустово ложе используемой ПЛИС. Плясать всегда нужно от ресурсов, имеющихся в ПЛИС. Пусть Ваш схемотехник, например, ежели он такой умный, попробует разрисовать свои квадратики по предложенной времянке, используя D-триггеры, счетчики, мультиплексоры и другую логику :-). А Вы потом это все опишите на VHDL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Victor 0 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта. В общем опять не то получилось. Хм... но вроде как - то. Прошу прощения, не сказал, что коэфф-т делителя считать от 0. Т.е. 0 = 1/1, 1 = 1/2, 2 = 1/3 и т.д. Так что при коэфф-те 2 как раз так и получится. Единственная странность, что смещение не правильно отрабатывает и CLK смещен на полтакта от переднего фронта... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта /////// Мне кажется, Вас загнали в логическую ловушку. Ну посудите сами. Делитель на 2. Значит на выходе сигнал с периодом длительностью в 2 периода clk. Спрашивается зачем его задерживать на три периода clk. Ведь при непрерывном формировании этих сигналов это эквивалентно задержке на один период clk. А если задержать на 2 периода, то сигналы на выходе идентичны. А если это все формируется от clk и clk_x2 у Вас нет, то меандр можно получить только на значениях 2 в степени n. Ну и самое главное, запись других значений Ну и самое главное, запись других значений пересчета. При таком подходе это сбой в функционировании системы. Все что Вы ходтите укладывается в 2 взаимосвязанных счетчика. Где есть ограничение. Второй функционирует в периоде функционирования первого и перезапись новых значений возможна только после отработки предыдущего полного периода первого счетчика. И этого вполне достаточно, чтобы описать и Вашу систему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Уважаемый sazh, не могли бы вы хотя бы вкраце описать работу вашей схемы, в совсем непонятных местах я поставил знаки --????????????????????-- module shim ( input clk, input [7:0] del_clk, input [7:0] prog, output reg set, --????????????????????-- output shim, output reg ochibka --????????????????????-- ); reg [7:0] ct_a; reg [7:0] ct_b; reg enable; always @(posedge clk) begin if (ct_a == 8'd1) ct_a <= (del_clk == 8'd0) ? 8'd1 : del_clk; else ct_a <= ct_a - 1'b1; if (ct_a == 8'd1) ct_b <= (prog == 8'd0 ) ? 8'd1 : prog; else if (enable) --????????????????????-- ct_b <= ct_b - 1'b1; if (ct_a == 8'd1) enable <= 1'b1; else if (ct_b == 8'd1) enable <= 1'b0; set <= (ct_b == 8'd1); --????????????????????-- ochibka <= (del_clk <= prog); --????????????????????-- end assign shim = enable; endmodule я попытался перевести её в VHDL library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Verilog2VHDL_SHIM is Port ( clk : in STD_LOGIC; del_clk : in STD_LOGIC_VECTOR (15 downto 0); prog : in STD_LOGIC_VECTOR (15 downto 0); set : out STD_LOGIC; shim : out STD_LOGIC; ochibka : out STD_LOGIC); end Verilog2VHDL_SHIM; architecture Behavioral of Verilog2VHDL_SHIM is signal ct_a : STD_LOGIC_VECTOR (15 downto 0); signal ct_b : STD_LOGIC_VECTOR (15 downto 0); signal enable : STD_LOGIC; begin process(clk) begin if(clk='1' and clk'event) then if (ct_a = "1111111111111111") then if del_clk = "0000000000000000" then ct_a <= "1111111111111111"; else ct_a <= del_clk; end if; else ct_a <= ct_a - 1; end if; if (ct_a = "1111111111111111") then if prog = "0000000000000000" then ct_b <= "1111111111111111"; else ct_b <= prog; end if; elsif (enable='1') then ct_b <= ct_b - 1; end if; if (ct_a = "1111111111111111") then enable <= '1'; elsif (ct_b = "1111111111111111")then enable <= '0'; end if; -- set <= (ct_b ="1111111111111111"); Тут явное несоответствие типов,либо я чего-то не понял -- ochibka <= (del_clk <= prog); end if; end process; shim <= enable; end Behavioral; Надеюсь я правильно понял Вашу логику? Хотелось бы промоделировать, но необходимо уточнить неясности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klop 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Друзья Вы б про агрегаты в VHDL вспомнили ради прикола "1111111111111111" описывается как (others => '1') (ну кроме сравнений конечно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу: Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки, который необходимо описать. С выхода делителя частоты сигналы поступают на вход set таймера задержки,т.е. set равен clk/(1...65536).Количество тактов clk, через которое сигнал set должен появится на выходе таймера задержки pinout задаётся на входе таймера prog от 0 до 65565. Задерживаться должен КАЖДЫЙ сигнал set. Например, при коэффициенте делителя частоты =2 и prog=1 должно получиться следующее: 0011001100110011001100110011001100 clk 0011110000111100001111000011110000 set 0000001111000011110000111100001111 pinout Вот надеюсь так будет правильнее. Когда может изменяться сигнал prog? Каким должно быть поведение pinout при изменении сигнала prog? Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk? Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом? Знаете ли, это вопросы, которые должен задать программист перед началом решения программистской задачи. Потому как они имеют отношение к полноте спецификаций алгоритма. Вы их не задали. Вывод: Вы и не программист. Какая Ваша основная область деятельности? И, кстати. что должно случиться при изменении коэффициента деления делителя? P.S. Так называемого "схемотехника" нужно гнать в шею. Так как его роль непонятна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Вы правильно поняли мою логику. Так как эта схема имеет ограничение (она не будет работать когда период cta меньше или равно ctb, загрузку 0 я заменил 1 (задержка 0 не имеет смысла. пропускайте сигнал мимо схемы)), я это вывел ввиде сигнала ошибки. set тоже внутренний сигнал. ну и моделировать надо с меньшей разрядностью. Счетчики работают на минус. По включению инициализируются в ноль. Пока 64 тысячи отсчитают, чтобы в синхронизм войти. Загрузка новых значений когда cta досчитает до 1. Получите плавное изменеие времянки. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Verilog2VHDL is Port ( clk : in STD_LOGIC; del_clk : in STD_LOGIC_VECTOR (7 downto 0); prog : in STD_LOGIC_VECTOR (7 downto 0); shim : out STD_LOGIC); end Verilog2VHDL; architecture Behavioral of Verilog2VHDL is signal ct_a : STD_LOGIC_VECTOR (7 downto 0); signal ct_b : STD_LOGIC_VECTOR (7 downto 0); signal enable : STD_LOGIC; begin process(clk) begin if(clk='1' and clk'event) then if (ct_a = 1) then if del_clk = 0 then ct_a <= "00000001"; else ct_a <= del_clk; end if; else ct_a <= ct_a - 1; end if; if (ct_a = 1) then if prog = 0 then ct_b <= "00000001"; else ct_b <= prog; end if; elsif (enable='1') then ct_b <= ct_b - 1; end if; if (ct_a = 1) then enable <= '1'; elsif (ct_b = 1)then enable <= '0'; end if; end if; end process; shim <= enable; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
darkniisiis 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Кому интересно, вот схема которой меня наградили ( в корявом варианте ) Отвечаю на вопросы - Когда может изменяться сигнал prog? - Сигнал prog задаётся только перед началом работы схемы и может измениться только при её перезапуске (сбросе). - Каким должно быть поведение pinout при изменении сигнала prog? - Думаю этот вопрос исчерпан - Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk? - Такого по идее не должно случиться ибо они взаимозависимы (по поводу временных задержек история умалчивает :) ), но в этом не ничего страшного, ибо один такт мы можем позволить себе потерять,это не баг, это фича. - Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом? - Сигнал set является производным через делитель от clk, дополнительно нет никакой синхронизации. Следовательно минимально реализуемая задержка равна 2 такта,этим можно пока ограничиться (да это следовало упомянуть) - Какая Ваша основная область деятельности? - Универсальный солдат, т.е. занимаюсь всем чем прикажут, независимо компетентен ли я в этом или нет, компитентность приходится вырабатывать путём обучения. Только не спрашивайте кто я по специальности, будете смеяться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Кому интересно, вот схема которой меня наградили ( в корявом варианте ) Отвечаю на вопросы - Когда может изменяться сигнал prog? - Сигнал prog задаётся только перед началом работы схемы и может измениться только при её перезапуске (сбросе). - Каким должно быть поведение pinout при изменении сигнала prog? - Думаю этот вопрос исчерпан - Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk? - Такого по идее не должно случиться ибо они взаимозависимы (по поводу временных задержек история умалчивает :) ), но в этом не ничего страшного, ибо один такт мы можем позволить себе потерять,это не баг, это фича. - Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом? - Сигнал set является производным через делитель от clk, дополнительно нет никакой синхронизации. Следовательно минимально реализуемая задержка равна 2 такта,этим можно пока ограничиться (да это следовало упомянуть) - Какая Ваша основная область деятельности? - Универсальный солдат, т.е. занимаюсь всем чем прикажут, независимо компетентен ли я в этом или нет, компитентность приходится вырабатывать путём обучения. Только не спрашивайте кто я по специальности, будете смеяться. Наслаждайтесь library ieee; use ieee.numeric_bit.all; entity Timer is generic( MaxDelay : positive := 65536 ); port( Clk : in bit; ProgDelay : in integer range 2 to MaxDelay; Set : in bit; SetDelayed : out bit ); end Timer; architecture Behavioral of Timer is signal delayLine : bit_vector( 0 to MaxDelay ) := (others => '0'); begin process( Clk ) begin if rising_edge( Clk ) then delayLine <= Set & delayLine( 0 to MaxDelay - 1 ); end if; end process; SetDelayed <= delayLine( ProgDelay ); end Behavioral; Знаете, если серьезно, мне кажется, что Вы не до конца поняли задачу. Или Вам её не до конца объяснили. Так как только пьяному схемотехнику может прийти в голову идея формировать сигнал счетчиком, а потом его задерживать очень длинной лиинией задержки, не важно, как её реализуя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба in integer range 2 to MaxDelay; Шутить изволите? Не боитесь, что потом попросят объяснить, куда делись неиспользуемые разряды порта? Используйте std_logic и std_logic_vector и ничего кроме них в портах! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться