реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вывод заданного количества импульсов., Как правильно сделать?
Iptash
сообщение May 18 2011, 14:23
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Здравствуйте.
На первый взгляд вроде простая задача, но как то в голову не приходит как это правильно сделать. Вот допустим:
Код
always @ (negedge clock) begin
    result = A - B;
   end

Теперь нужно выдать пачку импульсов количеством равное result. И так все время между вычислением разности. Т.е. допустим первая разность 10 и теперь
на какой то частоте выдаются эти 10 импульсов. Следущая разность допустим 5 , выдаются 5 импульсов и т.д..
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение May 18 2011, 14:51
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(Iptash @ May 18 2011, 18:23) *
Здравствуйте.
На первый взгляд вроде простая задача, но как то в голову не приходит как это правильно сделать. Вот допустим:
Код
always @ (negedge clock) begin
    result = A - B;
   end

Теперь нужно выдать пачку импульсов количеством равное result. И так все время между вычислением разности. Т.е. допустим первая разность 10 и теперь
на какой то частоте выдаются эти 10 импульсов. Следущая разность допустим 5 , выдаются 5 импульсов и т.д..

Я б сделал следующим образом:
Код
always @(posedge clk0) clock_r<=clock;//задержка тактовой на один такт новой частоты
always @(posedge clk0) imp_clocks<=~clock&clocks_r;//момент спада частоты в виде импульса на новой частоте

always @(posedge clk0)
     if (imp_clocks) begin
                         cnt_flag<={results,1'b0};//формируется счетчик в два раза больше, нежели results, который будет использоваться в качестве разрешающего сигнала для пачки импульсов
                         impuls<=1'b1;//начальное значение импульса
                         end
                         else begin
                               cnt_flag<=(|cnt_flag)?cnt_flag<=cnt_flag-1:cnt_flag;//уменьшение на единицу до тех пор пока не будет 0
                               impuls<=~impuls;//формирование самого импульса
                               end
assign pack_imp=(|cnt_flag)?impuls:1'b0;


Тут получатся импулсы с двойной частотой clk0, скважность вроде просто поменять. Чтоб метастабильности не было можно imp_clocks пропустить еще через дополнительный триггер.
Go to the top of the page
 
+Quote Post
Iptash
сообщение May 18 2011, 15:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Спасибо, сейчас попробую.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 19 2011, 05:48
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



То, что Вам нужно, называется программируемый таймер. Записываете в него код и даете разрешение на работу. И он через определенное число тактов выключается. И этот таймер нужно использовать как сигнал разрешения.
У меня пример на Верилоге приведен в "Кратком курсе HDL", у меня на сайте, в статьях...
Обычно такой таймер применяется совместно со статическим автоматом, для организации различных интервалов в разных состояниях автомата...
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Iptash
сообщение May 19 2011, 09:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Спасибо. Дайте пожалуйста адрес сайта. Вот написал код, для положительного результата выдаются импульсы по plus, а по отрицательному результату по minus. Но
мне кажется есть более красивое решение.
Код
module subb
(
  input shortint  A,
  input shortint  B,
  input bit clock, clk,
  output shortint result,
  output logic plus, minus
);

shortint i1, i2;
bit sos, plus1, plus2, minus1, minus2;


always_ff @ (negedge clock) begin
  result <= A - B;
  sos <= ~sos;
end

always @ (posedge clk) begin
   if(sos) begin  
     if(i1 < result) begin
      plus1 <= ~plus1;
      if(plus1)
       i1 <= i1 + 1'b1;
     end else if(i1 > result) begin
      minus1 <= ~minus1;
      if(minus1)
       i1 <= i1 - 1'b1;
     end  
   end else
   i1 <= 0;  
end      

  always @ (posedge clk) begin
   if(!sos) begin  
     if(i2 < result) begin
      plus2 <= ~plus2;
      if(plus2)
       i2 <= i2 + 1'b1;
      end else if(i2 > result) begin
       minus2 <= ~minus2;
       if(minus2)
         i2 <= i2 - 1'b1;
     end    
   end else
   i2 <= 0;  
end

assign plus = sos ? plus1 : plus2;
assign minus = sos ? minus1 : minus2;

endmodule


Вот результат в симуляторе.

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 08:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016