Перейти к содержанию
    

Делитель с переменным коэффициентом деления

поругайте меня пожалуйста и ткните носом в чем конкретно ошибки и может можно как нибудь упростить, но вроде и так все элементарно просто.

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;

файл полный ошибок, а чем до конца разобраться пока не могу (ЧАЙНИК пока, но желаю стать профи)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте так

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поругайте меня пожалуйста и ткните носом в чем конкретно ошибки и может можно как нибудь упростить, но вроде и так все элементарно просто.

 

файл полный ошибок, а чем до конца разобраться пока не могу (ЧАЙНИК пока, но желаю стать профи)

 

Не совсем понял идею как делить. На 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понял идею как делить.

 

идея в том что есть 2 вход: тактов и коэффициент деления

и один выход, собственно деленых тактов.

 

первый процесс запускается при изменении коэффициента деления и делает его четным

второй процесс запускается входными тактами и на каждый такт увеличивает свою переменную на 1.

при этом изначально на выход выдается “1” а после подсчета до “коэффициент деления/2” (для этого и делал его четным) выход сбрасыватся в “0” после досчета до “коэффициент деления” внутренняя переменная снова обнуляется и поехали все заново.

 

Вот такая идея

но вот ошибок много выдает я так понимаю что там что-то с типами переменных накосячил, но не могу понять где именно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

идея в том что есть 2 вход: тактов и коэффициент деления

и один выход, собственно деленых тактов.

 

первый процесс запускается при изменении коэффициента деления и делает его четным

второй процесс запускается входными тактами и на каждый такт увеличивает свою переменную на 1.

при этом изначально на выход выдается ”1” а после подсчета до ”коэффициент деления/2” (для этого и делал его четным) выход сбрасыватся в ”0” после досчета до ”коэффициент деления” внутренняя переменная снова обнуляется и поехали все заново.

 

Вот такая идея

но вот ошибок много выдает я так понимаю что там что-то с типами переменных накосячил, но не могу понять где именно.

Так Ваша идея полностью реализована в привенных примерах (в моем VHDL описании и в описании на Verilog предоставленном MAXXXX (PS на первый взгляд и беглом просмотре предоставленного MAXXXX описания)). Я привел даже краткое описание работы. Вы проверяли предложенные описания и пытались понять их, разобраться в них? Чем они Вас не устраивают конкретно? Что именно Вам не понятно?

обсуждение похожих вопросов:

ссылка

ссылка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Вашем коде Maverick со счетчиком все понятно, а вот с компаратором чет неочень

вот как я понял работу вашего кода:

 

счетчик постоянно считает от своего мин до своего МАХ

получается допустим задаем константу 20

счетчик считает на от нуля до 20 и на выходе мы имеем ”1” после чего счетчик продолжает считать от 20 до Х"1111111111111111"

и все это время на выходе у нас ”0” потом счетчик обнуляется на выходе получается ”1” все заново. и где-же тут переменный коэффициент деления если постоянно получается что период у нас Х"1111111111111111"??? ОБЪЯСНИТЕ

 

а код мне нужен на VHDL т.к. весь проект создается на этом языке.

Изменено пользователем avarte

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Вашем коде Maverick со счетчиком все понятно, а вот с компаратором чет неочень

вот как я понял работу вашего кода:

 

счетчик постоянно считает от своего мин до своего МАХ

получается допустим задаем константу 20

счетчик считает на от нуля до 20 и на выходе мы имеем ”1” после чего счетчик продолжает считать от 20 до Х"1111111111111111"

и все это время на выходе у нас ”0” потом счетчик обнуляется на выходе получается ”1” все заново. и где-же тут переменный коэффициент деления если постоянно получается что период у нас Х"1111111111111111"??? ОБЪЯСНИТЕ

 

а код мне нужен на VHDL т.к. весь проект создается на этом языке.

Так я Вам и предоставил описание на VHDL.

Попытаюсь Вам объяснить период формируемого сигнала это 0 - максимальное значение счечика. Как Вы уже правильно поняли с помощью компаратора формируется "еденичный полупериод" и "нулевой полупериод" |-------1--------|________0_______|----------1-и так далее.

Если Вам нужен переменный коэффициент деления - делаете счетчик с предустановкой или производите его сброс по достижении определенного значения (можно сделать второй компаратор, по которому производиться сброс счетчика, а значение ему подается на вход.), таким образом уменьшаете период сигнала. Можно сделать если у Вас коефициентов деления некоторое постоянное число (N), можно сделать N параллельно вставить мое описание, а выходы пропустить через мультиплексор (N в 1). Таким образом, управление сводиться к управлению мультиплекссором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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и. Извините, но это не код, а сплошное недоразумение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) более одного раза. это не могу понять поясните пожалуйста

Изменено пользователем avarte

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот это уже по теме СПАСИБО!

Я не хочу брать чей-то код, хоть он 100-процентно правильный (за которые конечно спасибо), я хочу сам разобраться и написать свой собственный

 

 

 

3. Нельзя назначать один сигнал (count_b и vixod) более одного раза. это не могу понять поясните пожалуйста

Понимаете, что в Verilog, что в VHDL имеется стандартные конструкции - описания различных цифровых устройств (счетчики, тригеры, дешифраторы и т.д.), которым если следовать тогда взаимопонимание Ваше с синтезатором будет 100%. Иначе будет очень плохо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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))"

Изменено пользователем kuchynski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...