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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопросы начинающего в ПЛИС
Shaienn
сообщение Feb 3 2010, 11:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Добрый день.

Начинаю работать с ПЛИС. Хочу сделать устройство, выделяющее четные и нечетные единицы в исходной информационной последовательности.

написал следующий код:
Код
module Try_AND
(
    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!
    clock, data, ones, zeroes
    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!
);
// Port Declaration
    input clock;
    input data;
    output ones;
    output zeroes;
    // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
    
    wire p1;
    reg out_c;
    reg out_n;
    
    assign ones = out_c & data;
    assign zeroes = out_n & data;
    assign p1 = data & clock;    
    
    always @(posedge p1) begin
                         out_c<=~out_c;
                         out_n<=out_c;
                         end
        
            
endmodule


Первая просьба. Посмотрите, вообще правильно пишу?

Второй вопрос, Квартус выдает следующий анализ:
Прикрепленное изображение


Такой сдвиг относительно исходных сигналов - это нормально? Я понимаю, задержка и все такое, но как-то много. И как избавиться от коротких импульсов, возникающих, видимо, как раз из-за этой задержки?

Спасибо.
Go to the top of the page
 
+Quote Post
Костян
сообщение Feb 3 2010, 11:26
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



У вас асинхронный дизайн !!! Так делать не стоит....

Должно быть что-то вроде:
Код
  
   always @(posedge clock)
      if (reset)
         data_in  <= 1'b0;
      else
         data_in  <= data;

   assign ones = data_in ? 1'b1 : 1'b0;
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Feb 3 2010, 11:57
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



попробовал применить Ваш совет:

Код
module Try_AND
(
    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!
    clock, data, ones, zeroes
    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!
);
// Port Declaration
    input clock;
    input data;
    output ones;
    output zeroes;
    // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
    
    reg out_c;
    reg out_n;
    wire ones;
    wire zeroes;
    reg reset;
    reg data_in;
    

    always @(posedge clock)
      if (reset)
                begin
         out_c  <= 1'b0;
         out_n  <= 1'b0;
                end
      else
                begin
         out_c  <= ~out_c;
         out_n <= out_c;
                end
        
    assign ones = data & out_c ? 1'b1 : 1'b0;
    assign zeroes = data & out_n ? 1'b1 : 1'b0;
            
endmodule


Результат анализа такой-же, как и в первом посте. Есть мелкие лишние импульсы. Или я что-то неправильно понял?

Спасибо.

Сообщение отредактировал Shaienn - Feb 3 2010, 11:57
Go to the top of the page
 
+Quote Post
Костян
сообщение Feb 3 2010, 12:16
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



Цитата(Shaienn @ Feb 3 2010, 09:57) *
Код
         out_c  <= ~out_c;
         out_n <= out_c;
..

Не совсем понятно почему так ? ....

Сделайте следующее

Код
reg [1:0] count;

    always @(posedge clock)
      if (reset)
         count  <= 2'b0;
      else
         if (data)
             count  <= count + 1;
            

   assign zeroes = data ? count[0] : 1'b0;
.....



Смысл . Создаем счетчик (впринципе достаточно и одного разряда , но для наглядности два wink.gif ). Инкрементируем его, если data равно 1, тем самым подсчитывая кол-во единиц в потоке.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Feb 3 2010, 12:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Shaienn @ Feb 3 2010, 15:57) *
Результат анализа такой-же, как и в первом посте. Есть мелкие лишние импульсы. Или я что-то неправильно понял?


Хм, а что странного в выбросах на выходах комбинационной логики?
Если Ваш дизайн - синхронный, то все эти "переходные процессы" должны закончиться к приходу следующего фронта клока.

Ну или пропустите их через регистры, тактируемые системным клоком - на выходе получите сигнал без иголок
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Feb 3 2010, 12:22
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



не, Вы меня, кажется, немножко не поняли.

Задача такая:
Есть входной поток информации. Синхросигнал. И есть два выхода. На первом (zeroes) выдаются нечетные единицы, а на втором (ones) - четные. Как на приложенном в первом посте графике.

PS. Вдумчиво вчитался в Ваш ответ. Буду думать.

Цитата(Dima_G @ Feb 3 2010, 15:20) *
Хм, а что странного в выбросах на выходах комбинационной логики?
Если Ваш дизайн - синхронный, то все эти "переходные процессы" должны закончиться к приходу следующего фронта клока.

Ну или пропустите их через регистры, тактируемые системным клоком - на выходе получите сигнал без иголок


Так вот я, собственно, и спрашиваю - это норма или мой косяк smile.gif

Сообщение отредактировал Shaienn - Feb 3 2010, 12:23
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 3 2010, 12:31
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Shaienn @ Feb 3 2010, 14:15) *
Добрый день.

Начинаю работать с ПЛИС. Хочу сделать устройство, выделяющее четные и нечетные единицы в исходной информационной последовательности.


В исходной информационной последовательности нули ведь тоже есть. При этом надо идентифицировать паузу (когда нет информационной последовательности).
Должно быть как минимум два входных провода по данным. (например когда есть последовательность, данные взаимоинверсны, когда нет последовательности, на обоих входах данных например нули).
При Вашем подходе нет понятия начала посылки данных.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Feb 3 2010, 12:34
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Shaienn @ Feb 3 2010, 15:22) *
Так вот я, собственно, и спрашиваю - это норма или мой косяк smile.gif


если я правильно понимаю Вашу задачу, то ее можно описать так:

Код
bit bNot_Chet;

always_ff @(posedge bClock, posedge bReset) begin
  if (bReset) begin
    bNot_Chet <= '0;
  end else
  if (bData)  begin
    bNot_Chet <= ~bNot_Chet;
  end
end

assign bChetOne     = (~bNot_Chet) && bData;
assign bNotChetOne = bNotChet && bData;


Сообщение отредактировал Dima_G - Feb 3 2010, 12:36
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Feb 3 2010, 12:43
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Цитата(sazh @ Feb 3 2010, 15:31) *
В исходной информационной последовательности нули ведь тоже есть. При этом надо идентифицировать паузу (когда нет информационной последовательности).
Должно быть как минимум два входных провода по данным. (например когда есть последовательность, данные взаимоинверсны, когда нет последовательности, на обоих входах данных например нули).
При Вашем подходе нет понятия начала посылки данных.


ну как, в конечном назначении
Код
assign ones = data & out_c ? 1'b1 : 1'b0;

условие появления сигнала на линии - это наличие единицы в информационной последовательности и установленный флаг четной единицы. Когда в информационной последовательности ноль, на выходе тоже ноль.

Цитата(Dima_G @ Feb 3 2010, 15:34) *
если я правильно понимаю Вашу задачу, то ее можно описать так:

Код
bit bNot_Chet;

always_ff @(posedge bClock, posedge bReset) begin
  if (bReset) begin
    bNot_Chet <= '0;
  end else
  if (bData)  begin
    bNot_Chet <= ~bNot_Chet;
  end
end

assign bChetOne     = (~bNot_Chet) && bData;
assign bNotChetOne = bNotChet && bData;


Я думал примерно также (см. первый пост). У меня только отсутствует сигнал Reset.
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 3 2010, 12:52
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Shaienn @ Feb 3 2010, 15:43) *
условие появления сигнала на линии - это наличие единицы в информационной последовательности и установленный флаг четной единицы. Когда в информационной последовательности ноль, на выходе тоже ноль.
Я думал примерно также (см. первый пост). У меня только отсутствует сигнал Reset.


А может установленный флаг нечетной единицы? А если в информационной последовательности сплошные нули? Почему первая единица в потоке всегда четная.
Никому не нужен этот ресет. Он не задает периодичность посылок.
Обычно данные сопровождаются стробом, в котором и определяют понятие четности нечетности.
Поставьте сначала задачу, на базе которой получите схемную реализацию.
Go to the top of the page
 
+Quote Post
yuri_d
сообщение Feb 3 2010, 12:58
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(Shaienn @ Feb 3 2010, 14:15) *
Такой сдвиг относительно исходных сигналов - это нормально? Я понимаю, задержка и все такое, но как-то много. И как избавиться от коротких импульсов, возникающих, видимо, как раз из-за этой задержки?

Тестбенч написан неправильно (или ТЗ неправильное). Совпадают фронты тактового сигнала и данных. Нечего удивлятся, что появляются короткие импульсы.

А сдвиг выходный данный относительно входных обязательно должен быть. Если кажется, что много, то посчитайте на бумажке используя информацию из datasheet-а.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Feb 3 2010, 13:13
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Всем спасибо. Вопросы пока кончились.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Feb 3 2010, 13:17
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



.

Сообщение отредактировал Dima_G - Feb 3 2010, 13:18
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Feb 3 2010, 15:44
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Возник еще один вопрос:

Код
input clock;
output S;

reg [6:0] Q;

initial begin
        Q = 7'b1111110;
    end

always @(posedge clock)
begin
Q <= Q <<< 1;
end

assign S = Q[6];


Хочу с каждым тактовым импульсом двигать содержимое регистра Q и выдавать на выход значение в шестой ячейке регистра Q. Т.е., по сути, хочу реализовать циклический сдвиг, но почему-то не работает. Взгляните пожалуйста.
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 3 2010, 16:13
Сообщение #15


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Shaienn @ Feb 3 2010, 09:44) *
Хочу с каждым тактовым импульсом двигать содержимое регистра Q и выдавать на выход значение в шестой ячейке регистра Q. Т.е., по сути, хочу реализовать циклический сдвиг, но почему-то не работает. Взгляните пожалуйста.

так циклический или логический? по коду все нормально %)


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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