Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы начинающего в ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Shaienn
Добрый день.

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

написал следующий код:
Код
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


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

Второй вопрос, Квартус выдает следующий анализ:
Нажмите для просмотра прикрепленного файла

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

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

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

   assign ones = data_in ? 1'b1 : 1'b0;
Shaienn
попробовал применить Ваш совет:

Код
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, 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, тем самым подсчитывая кол-во единиц в потоке.
Dima_G
Цитата(Shaienn @ Feb 3 2010, 15:57) *
Результат анализа такой-же, как и в первом посте. Есть мелкие лишние импульсы. Или я что-то неправильно понял?


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

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

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

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

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

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


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

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


В исходной информационной последовательности нули ведь тоже есть. При этом надо идентифицировать паузу (когда нет информационной последовательности).
Должно быть как минимум два входных провода по данным. (например когда есть последовательность, данные взаимоинверсны, когда нет последовательности, на обоих входах данных например нули).
При Вашем подходе нет понятия начала посылки данных.
Dima_G
Цитата(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;
Shaienn
Цитата(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.
sazh
Цитата(Shaienn @ Feb 3 2010, 15:43) *
условие появления сигнала на линии - это наличие единицы в информационной последовательности и установленный флаг четной единицы. Когда в информационной последовательности ноль, на выходе тоже ноль.
Я думал примерно также (см. первый пост). У меня только отсутствует сигнал Reset.


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

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

А сдвиг выходный данный относительно входных обязательно должен быть. Если кажется, что много, то посчитайте на бумажке используя информацию из datasheet-а.
Shaienn
Всем спасибо. Вопросы пока кончились.
Dima_G
.
Shaienn
Возник еще один вопрос:

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

так циклический или логический? по коду все нормально %)
Shaienn
Цитата(des00 @ Feb 3 2010, 19:13) *
так циклический или логический? по коду все нормально %)


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


просто при установке assign S = Q[0], квартус говорит: Pin "S" is stuck at GND, а это странно, потому что при циклическом сдвиге на этой позиции должны появляться единицы...
des00
Цитата(Shaienn @ Feb 3 2010, 10:26) *
циклический, хочу, чтобы эта комбинация по кругу выдавалась на выход.

тогда и описывайте его. вы же пишете выражение арифметического сдвига(см. стандарт на язык верилог), квартус все правильно делает. В 0 бите всегда будет 0 %)
Shaienn
Цитата(des00 @ Feb 3 2010, 20:29) *
тогда и описывайте его. вы же пишете выражение арифметического сдвига(см. стандарт на язык верилог), квартус все правильно делает. В 0 бите всегда будет 0 %)


Так вроде арифметический - это <<, а циклический <<<. Разве не так?
Dima_G
<< - битовый сдвиг
<<< - арифметический

Код
input clock;
output S;

reg [6:0] Q;

initial begin
        Q = 7'b1111110;
    end

always @(posedge clock)
begin
  Q <= {Q[5:0], Q[6]};
end

assign S = Q[6];
des00
Цитата(Shaienn @ Feb 3 2010, 17:15) *
Так вроде арифметический - это <<, а циклический <<<. Разве не так?

не зря я вам посоветовал, учите матчасть %)

IEEE Standard Verilog Hardware Description Language IEEE Std 1364-2001 -> 4.1.12 Shift operators

Цитата
4.1.12 Shift operators
There are two types of shift operators, the logical shift operators, << and >>, and the arithmetic shift opera-
tors, <<< and >>>. The left shift operators, << and <<<, shall shift their left operand to the left by the num-
ber by the number of bit positions given by the right operand. In both cases, the vacated bit positions shall be
filled with zeroes. The right shift operators, >> and >>>, shall shift their left operand to the right by the num-
ber of bit positions given by the right operand. The logical right shift shall fill the vacated bit positions with
zeroes. The arithmetic right shift shall fill the vacated bit positions with zeroes if the result type is unsigned.
It shall fill the vacated bit positions with the value of the most-significant (i.e., sign) bit of the left operand if
the result type is signed. If the right operand has an unknown or high impedence value, then the result shall
be unknown. The right operand is always treated as an unsigned number and has no effect on the signedness
of the result. The result signedness is determined by the left-hand operand and the remainder of the expres-
sion, as outlined in 4.5.1
Shaienn
Учу-учу матчасть smile.gif

Оказывается арифметический и циклический сдвиг - это одно и то же.

Так вот мне и нужен циклический(арифметический) сдвиг. Который, согласно мануалу - <<<;

Нужно, чтоб работало именно так:
Цитата
It shall fill the vacated bit positions with the value of the most-significant (i.e., sign) bit of the left operand if
the result type is signed.


Но непонятно, что имеется в виду под словами result type?

Выполнив:
Q = 7'b0000111
Q <= Q <<< 3
Хочу получить:
Q == 7'b0111000....
des00
Цитата(Shaienn @ Feb 3 2010, 22:04) *
Оказывается арифметический и циклический сдвиг - это одно и то же.

вроде одни и те же доки читаем, а результат разный %)

Цитата
Нужно, чтоб работало именно так:

направление сдвига не перепутали ?smile.gif слова про msb относились к сдвигу вправо >>>, а не влево <<< %)

Цитата(Shaienn @ Feb 3 2010, 22:04) *
Выполнив:
Q = 7'b0000111
Q <= Q <<< 3
Хочу получить:
Q == 7'b0111000.

в данном случае именно так и будет, но если Q получает значение только по initial, то квартус Q тупо подвесит VCC/GND и выдаст предупреждение.
но если вы имели в виду вот это
Цитата
Q = 7'b1000111
Q <= Q <<< 3
Хочу получить:
Q == 7'b0111100

то такое одними стандартными сдвигами не сделать, лучше воспользоваться конкатенацией %) например q <= {q[6:0], q[7]} для циклического сдвига на 1 бит.
Shaienn
Цитата(des00 @ Feb 4 2010, 08:10) *
вроде одни и те же доки читаем, а результат разный %)


направление сдвига не перепутали ?smile.gif слова про msb относились к сдвигу вправо >>>, а не влево <<< %)


в данном случае именно так и будет, но если Q получает значение только по initial, то квартус Q тупо подвесит VCC/GND и выдаст предупреждение.
но если вы имели в виду вот это

то такое одними стандартными сдвигами не сделать, лучше воспользоваться конкатенацией %) например q <= {q[6:0], q[7]} для циклического сдвига на 1 бит.


Да, хочу, чтобы работало как в приведенном Вами последнем примере. Спасибо за информацию. Буду грызть дальше.


Цитата(Dima_G @ Feb 4 2010, 07:49) *
<< - битовый сдвиг
<<< - арифметический

Код
input clock;
output S;

reg [6:0] Q;

initial begin
        Q = 7'b1111110;
    end

always @(posedge clock)
begin
  Q <= {Q[5:0], Q[6]};
end

assign S = Q[6];


Должно бы работать, но на выходе 0.

Цитата(des00 @ Feb 4 2010, 08:10) *
если Q получает значение только по initial, то квартус Q тупо подвесит VCC/GND и выдаст предупреждение.


А как правильно задать значение для Q?
des00
Цитата(Shaienn @ Feb 3 2010, 22:27) *
Должно бы работать, но на выходе 0.

у меня работает, моделирование в аттаче %)
скорее всего квартус игнорирует ваш initial, надо ему сказать что бы он этого не делал. либо сделать какой либо сигнал сброса вашей схемы, который инициализирует регистр Q
делается это в секции settings -> synthesis -> options -> Ignore Initial
Dima_G
Хм, а Вы к Quartus отлаживате? Тогда делайте инициализацию например по Reset
Или используйте для отладки симуляторы с поддержкой несинтезируемого подмножества smile.gif
Shaienn
Снова добрый день.

Спаял я макетную плату для epm3032. Вроде все правильно сделал. Обнаруживается через ByteBlaster.
Зашиваю следующий код:

Код
module Try_AND
(
    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!
    reset, clock, C
    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!
);
// Port Declaration
    input reset;
    input clock;
    output C;

assign C = clock && ~reset;
endmodule


Контакт reset - через кнопку на 3.3 вольта.
На выходе С = 0, независимо от состояние ноги reset. Но, в то же время, когда изменишь эту строчку на assign C = clock, на выходе, как и завещано, сигнал тактирования. Почему-то не обрабатывается сигнал reset. Подскажите направление поисков.

PS Pin Assignment сделал.

Спасибо.
sazh
Цитата(Shaienn @ Feb 10 2010, 10:21) *
Снова добрый день.
Контакт reset - через кнопку на 3.3 вольта.
На выходе С = 0, независимо от состояние ноги reset. Но, в то же время, когда изменишь эту строчку на assign C = clock, на выходе, как и завещано, сигнал тактирования. Почему-то не обрабатывается сигнал reset. Подскажите направление поисков.


В Квартусе синтезируемая инициализация пройдет таким образом без ресета
reg [6:0] Q = 7'b1111110;

Что касется кнопки, квартус не причем. Со схематикой кнопки намудрили. (На входе ресет надо получить не только уверренную 1, но и уверенный ноль (Если в функции с приоритетностью не напутано. Скобок для наглядности не жалейте. чтобы в стандарт не лазить).
Смотрите реализацию схемы в RTL просмотрщике квартуса.
Shaienn
Цитата(sazh @ Feb 10 2010, 11:36) *
В Квартусе синтезируемая инициализация пройдет таким образом без ресета
reg [6:0] Q = 7'b1111110;

Что касется кнопки, квартус не причем. Со схематикой кнопки намудрили. (На входе ресет надо получить не только уверренную 1, но и уверенный ноль (Если в функции с приоритетностью не напутано. Скобок для наглядности не жалейте. чтобы в стандарт не лазить).
Смотрите реализацию схемы в RTL просмотрщике квартуса.


Точно. Подвесил pulldown резистор к ноге и все стало как надо. Спасибо большое.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.