|
Вопросы начинающего в ПЛИС |
|
|
|
Feb 3 2010, 11:15
|
Частый гость
 
Группа: Участник
Сообщений: 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 Первая просьба. Посмотрите, вообще правильно пишу? Второй вопрос, Квартус выдает следующий анализ:
Такой сдвиг относительно исходных сигналов - это нормально? Я понимаю, задержка и все такое, но как-то много. И как избавиться от коротких импульсов, возникающих, видимо, как раз из-за этой задержки? Спасибо.
|
|
|
|
|
Feb 3 2010, 11:26
|
Знающий
   
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Feb 3 2010, 11:57
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 3 2010, 12:16
|
Знающий
   
Группа: Свой
Сообщений: 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; ..... Смысл . Создаем счетчик (впринципе достаточно и одного разряда , но для наглядности два  ). Инкрементируем его, если data равно 1, тем самым подсчитывая кол-во единиц в потоке.
|
|
|
|
|
Feb 3 2010, 12:20
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Shaienn @ Feb 3 2010, 15:57)  Результат анализа такой-же, как и в первом посте. Есть мелкие лишние импульсы. Или я что-то неправильно понял? Хм, а что странного в выбросах на выходах комбинационной логики? Если Ваш дизайн - синхронный, то все эти "переходные процессы" должны закончиться к приходу следующего фронта клока. Ну или пропустите их через регистры, тактируемые системным клоком - на выходе получите сигнал без иголок
|
|
|
|
|
Feb 3 2010, 12:22
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
не, Вы меня, кажется, немножко не поняли. Задача такая: Есть входной поток информации. Синхросигнал. И есть два выхода. На первом (zeroes) выдаются нечетные единицы, а на втором (ones) - четные. Как на приложенном в первом посте графике. PS. Вдумчиво вчитался в Ваш ответ. Буду думать. Цитата(Dima_G @ Feb 3 2010, 15:20)  Хм, а что странного в выбросах на выходах комбинационной логики? Если Ваш дизайн - синхронный, то все эти "переходные процессы" должны закончиться к приходу следующего фронта клока.
Ну или пропустите их через регистры, тактируемые системным клоком - на выходе получите сигнал без иголок Так вот я, собственно, и спрашиваю - это норма или мой косяк
Сообщение отредактировал Shaienn - Feb 3 2010, 12:23
|
|
|
|
|
Feb 3 2010, 12:34
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Shaienn @ Feb 3 2010, 15:22)  Так вот я, собственно, и спрашиваю - это норма или мой косяк  если я правильно понимаю Вашу задачу, то ее можно описать так: Код 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
|
|
|
|
|
Feb 3 2010, 12:43
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Feb 3 2010, 12:52
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(Shaienn @ Feb 3 2010, 15:43)  условие появления сигнала на линии - это наличие единицы в информационной последовательности и установленный флаг четной единицы. Когда в информационной последовательности ноль, на выходе тоже ноль. Я думал примерно также (см. первый пост). У меня только отсутствует сигнал Reset. А может установленный флаг нечетной единицы? А если в информационной последовательности сплошные нули? Почему первая единица в потоке всегда четная. Никому не нужен этот ресет. Он не задает периодичность посылок. Обычно данные сопровождаются стробом, в котором и определяют понятие четности нечетности. Поставьте сначала задачу, на базе которой получите схемную реализацию.
|
|
|
|
|
Feb 3 2010, 12:58
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274

|
Цитата(Shaienn @ Feb 3 2010, 14:15)  Такой сдвиг относительно исходных сигналов - это нормально? Я понимаю, задержка и все такое, но как-то много. И как избавиться от коротких импульсов, возникающих, видимо, как раз из-за этой задержки? Тестбенч написан неправильно (или ТЗ неправильное). Совпадают фронты тактового сигнала и данных. Нечего удивлятся, что появляются короткие импульсы. А сдвиг выходный данный относительно входных обязательно должен быть. Если кажется, что много, то посчитайте на бумажке используя информацию из datasheet-а.
|
|
|
|
|
Feb 3 2010, 15:44
|
Частый гость
 
Группа: Участник
Сообщений: 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. Т.е., по сути, хочу реализовать циклический сдвиг, но почему-то не работает. Взгляните пожалуйста.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|