avarte 0 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба поругайте меня пожалуйста и ткните носом в чем конкретно ошибки и может можно как нибудь упростить, но вроде и так все элементарно просто. entity DPKD is Port ( clk : in STD_LOGIC; vixod : out STD_LOGIC; koef_del : in bit_VECTOR (15 downto 0) ); end DPKD; architecture Behavioral of DPKD is begin process(koef_del) -- проверка на четность коэффициента деления если не четное то добавить один variable count: integer range 0 to 5; begin count := conv_integer(koef_del) mod 2; if(count = 1)then koef_del:= koef_del+1; end if end process; process(clk) -- процес делениячастоты variable count_b: std_logic_vector(15 downto 0); begin if(clk'event and clk='1') then count_b:=count_b + 1; if(count_b >= koef_del)then count_b:=X"0000"; vixod<='1'; end if; if(count_b = koef_del/2)then vixod<='0'; end if; end if; end process; end Behavioral; файл полный ошибок, а чем до конца разобраться пока не могу (ЧАЙНИК пока, но желаю стать профи) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба Попробуйте так library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity shim is Port ( clk : in STD_LOGIC; kod_in : in STD_LOGIC_VECTOR (15 downto 0); out_shim : out STD_LOGIC ); end shim; architecture Behavioral of shim is signal count_shim : STD_LOGIC_VECTOR (15 downto 0); begin process (clk) begin if clk'event and clk = '1' then count_shim <= count_shim + "0000000000000001"; end if; end process; process (clk) begin if clk'event and clk = '1' then if count_shim < kod_in then out_shim <= '1'; else out_shim <= '0'; end if; end if; end process; end Behavioral; Первый процесс описывает 16 разрядный счетчик, а второй описывает компаратор. Компаратор сравнивает значение счетчика со значением, которое подается на вход kod_in и соответственно формирует выход: if count_shim < kod_in then out_shim <= '1'; else out_shim <= '0'; end if; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXXXX 0 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба поругайте меня пожалуйста и ткните носом в чем конкретно ошибки и может можно как нибудь упростить, но вроде и так все элементарно просто. файл полный ошибок, а чем до конца разобраться пока не могу (ЧАЙНИК пока, но желаю стать профи) Не совсем понял идею как делить. На Veriloge сделал так module steering_divider(clk, reset, adress, out); input clk, reset; input [9:0] adress;// к-во импульсов clk за пол периода out output out; reg [9:0] count; reg out; // Реализация делителя частоты //---------------------------------------------------- always @(posedge clk or negedge reset) begin if (!reset) begin count <= 0; out <= 0; end else if (count==adress) begin count <= 0; out <= ~out; end else count <= count + 1; end //---------------------------------------------------- endmodule И ещё так module steering_divider(clk, reset, adress, out); parameter n = 32; // Размерность сумматора //parameter k = 214748365; // 5 mGz // те adress = 214748365; - получим 5 mGz если clk = 100 mGz input clk, reset; input [31:0] adress; output out; reg [n-1:0] dout; reg [n-1:0] accum; // Регистр сумматора reg out; // Реализация делителя частоты //----------------------------------------------- always @(accum or reset) if (!reset) dout <= 0; else dout <= accum; always @(posedge clk or negedge reset) begin if (!reset) accum <= 0; else accum <= accum + adress; end always @(posedge clk or negedge reset) begin if (!reset) out <= 0; else out <= accum[n-1]; end //---------------------------------------------------- endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
avarte 0 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба Не совсем понял идею как делить. идея в том что есть 2 вход: тактов и коэффициент деления и один выход, собственно деленых тактов. первый процесс запускается при изменении коэффициента деления и делает его четным второй процесс запускается входными тактами и на каждый такт увеличивает свою переменную на 1. при этом изначально на выход выдается “1” а после подсчета до “коэффициент деления/2” (для этого и делал его четным) выход сбрасыватся в “0” после досчета до “коэффициент деления” внутренняя переменная снова обнуляется и поехали все заново. Вот такая идея но вот ошибок много выдает я так понимаю что там что-то с типами переменных накосячил, но не могу понять где именно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба идея в том что есть 2 вход: тактов и коэффициент деления и один выход, собственно деленых тактов. первый процесс запускается при изменении коэффициента деления и делает его четным второй процесс запускается входными тактами и на каждый такт увеличивает свою переменную на 1. при этом изначально на выход выдается ”1” а после подсчета до ”коэффициент деления/2” (для этого и делал его четным) выход сбрасыватся в ”0” после досчета до ”коэффициент деления” внутренняя переменная снова обнуляется и поехали все заново. Вот такая идея но вот ошибок много выдает я так понимаю что там что-то с типами переменных накосячил, но не могу понять где именно. Так Ваша идея полностью реализована в привенных примерах (в моем VHDL описании и в описании на Verilog предоставленном MAXXXX (PS на первый взгляд и беглом просмотре предоставленного MAXXXX описания)). Я привел даже краткое описание работы. Вы проверяли предложенные описания и пытались понять их, разобраться в них? Чем они Вас не устраивают конкретно? Что именно Вам не понятно? обсуждение похожих вопросов: ссылка ссылка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
avarte 0 11 мая, 2009 Опубликовано 11 мая, 2009 (изменено) · Жалоба В Вашем коде Maverick со счетчиком все понятно, а вот с компаратором чет неочень вот как я понял работу вашего кода: счетчик постоянно считает от своего мин до своего МАХ получается допустим задаем константу 20 счетчик считает на от нуля до 20 и на выходе мы имеем ”1” после чего счетчик продолжает считать от 20 до Х"1111111111111111" и все это время на выходе у нас ”0” потом счетчик обнуляется на выходе получается ”1” все заново. и где-же тут переменный коэффициент деления если постоянно получается что период у нас Х"1111111111111111"??? ОБЪЯСНИТЕ а код мне нужен на VHDL т.к. весь проект создается на этом языке. Изменено 11 мая, 2009 пользователем avarte Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба В Вашем коде Maverick со счетчиком все понятно, а вот с компаратором чет неочень вот как я понял работу вашего кода: счетчик постоянно считает от своего мин до своего МАХ получается допустим задаем константу 20 счетчик считает на от нуля до 20 и на выходе мы имеем ”1” после чего счетчик продолжает считать от 20 до Х"1111111111111111" и все это время на выходе у нас ”0” потом счетчик обнуляется на выходе получается ”1” все заново. и где-же тут переменный коэффициент деления если постоянно получается что период у нас Х"1111111111111111"??? ОБЪЯСНИТЕ а код мне нужен на VHDL т.к. весь проект создается на этом языке. Так я Вам и предоставил описание на VHDL. Попытаюсь Вам объяснить период формируемого сигнала это 0 - максимальное значение счечика. Как Вы уже правильно поняли с помощью компаратора формируется "еденичный полупериод" и "нулевой полупериод" |-------1--------|________0_______|----------1-и так далее. Если Вам нужен переменный коэффициент деления - делаете счетчик с предустановкой или производите его сброс по достижении определенного значения (можно сделать второй компаратор, по которому производиться сброс счетчика, а значение ему подается на вход.), таким образом уменьшаете период сигнала. Можно сделать если у Вас коефициентов деления некоторое постоянное число (N), можно сделать N параллельно вставить мое описание, а выходы пропустить через мультиплексор (N в 1). Таким образом, управление сводиться к управлению мультиплекссором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuchynski 0 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба 1.Это не правильно: « koef_del:= koef_del+1;» koef_del – это ВХОД! 2. Проверка на чётность – это всего лишь проверка младшего бита, т.е. не «conv_integer(koef_del) mod 2;», а «koef_del(0)». 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. 4. Попытка писать на VHDL, как на Cи. Извините, но это не код, а сплошное недоразумение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба 1.Это не правильно: « koef_del:= koef_del+1;» koef_del – это ВХОД! 2. Проверка на чётность – это всего лишь проверка младшего бита, т.е. не «conv_integer(koef_del) mod 2;», а «koef_del(0)». 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. 4. Попытка писать на VHDL, как на Cи. Извините, но это не код, а сплошное недоразумение. Согласен :cheers: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
avarte 0 11 мая, 2009 Опубликовано 11 мая, 2009 (изменено) · Жалоба 1.Это не правильно: « koef_del:= koef_del+1;» koef_del – это ВХОД! 2. Проверка на чётность – это всего лишь проверка младшего бита, т.е. не «conv_integer(koef_del) mod 2;», а «koef_del(0)». 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. 4. Попытка писать на VHDL, как на Cи. Извините, но это не код, а сплошное недоразумение. Вот это уже по теме СПАСИБО! Я не хочу брать чей-то код, хоть он 100-процентно правильный (за которые конечно спасибо), я хочу сам разобраться и написать свой собственный 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. это не могу понять поясните пожалуйста Изменено 11 мая, 2009 пользователем avarte Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба Вот это уже по теме СПАСИБО! Я не хочу брать чей-то код, хоть он 100-процентно правильный (за которые конечно спасибо), я хочу сам разобраться и написать свой собственный 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. это не могу понять поясните пожалуйста Понимаете, что в Verilog, что в VHDL имеется стандартные конструкции - описания различных цифровых устройств (счетчики, тригеры, дешифраторы и т.д.), которым если следовать тогда взаимопонимание Ваше с синтезатором будет 100%. Иначе будет очень плохо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuchynski 0 12 мая, 2009 Опубликовано 12 мая, 2009 (изменено) · Жалоба 3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. это не могу понять поясните пожалуйста if(clk'event and clk='1') then if(count_b >= koef_del)then count_b:=count_b + 1; else count_b:=X"0000"; vixod<= not vixod; end if; end if; В этом процессе при проходе согласно всех if else, назначение count_b произойдет 1 раз. Возможны ответвления (if...else) где сигнал не будет назначен. Так же, если сигнал назначен в этом процессе, в другом его назначать нельзя, этой ошибки вы избежали. И ещё: деление на 2 - это всего лишь сдвиг вправо. Вроде мой компилятор не понимает "koef_del/2", или у меня осталась привычка со старых времен. Создайте сигнал, который будет в 2 раза меньше koef_del, и используете его, либо конструкцию вида "count_b = ('0' & koef_del(n downto 1))" Изменено 12 мая, 2009 пользователем kuchynski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
avarte 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба kuchynski Все понял спасибо за разъяснение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться