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

Как в плис реализовать триггер защёлку по уровню?

41 minutes ago, Yuri124 said:

Это вряд ли. 

Все диаграммы как близнецы и братья!!! Ещё раз проверил все варианты.

И добавил новый фронт EV пока сдвиг не завершился, хотя у меня такой случай невозможен.

Все варианты при таком повторном появлении фронта EV ведут себя одинаково. Картинку поведения прилагаю.

F.jpg

51 minutes ago, Yuri124 said:

Разница в скорости - вероятно, логика разная в проектах.

Сейчас я просто тестирую. Проект содержит только один единственный блок из трёх вариантов.

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


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

32 minutes ago, zombi said:

диаграммы как близнецы и братья!!!

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

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

Вы смотрели отчет  - автомат сколько бит реализован? - там таблица должна быть скорее всего из 16 строк и 16 столбцов, и единица бежит по диагонали.

А если убрать строку default (в реале это м.б. чревато) - меняется что-то по ресурсам и скорости?

И если убрать в проекте с автоматом оптимизацию по скорости, ресурсам и мощности.


 

Если к автомату вместо EV прикрутить как у Вас выделитель фронта (спада), то можно уменьшить число стостояний с 9 до 8 - будет только 3 бита, тогда ресурсов в режиме оптимизаци по скорости потребуется меньше (думаю) и упростится логическая обвязка внутри квартуса. Правда - при этом проще как у Вас описать этот сдвиговый регистр, а не расписывать автомат. Просто интересно по ресурсам и быстродействию что станет :)

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

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


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

Спасибо. Ясно что автомат потребует больше ресурсов чем просто девять триггеров.

И понятно что его легко адаптировать под новую задачу.

А можете с этим помочь?

1 hour ago, zombi said:

2.Кто может помочь описать схему из третьего теста на верилоге?

 

E.jpg

хочу её тоже прогнать но на верилоге.

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


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

module myshiftNEW (input res,clk,EV,output reg [7:0] q);
	wire A1 = !EV;
	reg  A2;
	wire A3 = A1 & A2;
	wire sEV = A3 | !q[7];
always @(posedge clk) A2 <= EV;

reg [3:0] state, next_state;
parameter IDLE     = 0,
          STATE_01 = 1,
          STATE_02 = 2,
          STATE_04 = 3,
          STATE_08 = 4,
          STATE_10 = 5,
          STATE_20 = 6,
          STATE_40 = 7;
          //STATE_80 = 8;

always @ (posedge clock_sys or negedge res)
        if (! res) state <= IDLE;
        else state <= next_state;



always @ (*)
        begin
           //next_state = 'bx;
                        
            case (state)
            
                IDLE:       begin
                               //if (ev) next_state = IDLE;
                               if (! sEV) next_state = IDLE;
                               else next_state = STATE_01;
                            end
               STATE_01:  next_state = STATE_02;
               STATE_02:  next_state = STATE_04;
               STATE_04:  next_state = STATE_08;
               STATE_08:  next_state = STATE_10;
               STATE_10:  next_state = STATE_20;
               STATE_20:  next_state = STATE_40;
               //STATE_40:  next_state = STATE_80;
               STATE_40:  next_state = IDLE;
               /*STATE_80:  begin
                               if (ev) next_state = IDLE;
                               else next_state = STATE_80;
                          end */

               default: next_state = IDLE;
            endcase
        end

always @ (posedge clock_sys or negedge res)
            if (! res)    begin
                                        q <= 8'b10000000;   
                                  end
            else
                                        
                    case (next_state)
                    
                       // IDLE:     ;
                        IDLE:     q <= 8'b10000000;   
                        STATE_01: q <= {q[6:0], q[7]};
                        STATE_02: q <= {q[6:0], q[7]};
                        STATE_04: q <= {q[6:0], q[7]};
                        STATE_08: q <= {q[6:0], q[7]};
                        STATE_10: q <= {q[6:0], q[7]};
                        STATE_20: q <= {q[6:0], q[7]};
                        STATE_40: q <= {q[6:0], q[7]};
                       // STATE_80: q <= 8'b10000000;       
                                          
                    endcase
                //end 

endmodule
23 minutes ago, zombi said:

с этим

так Вы ж это уже описали - закольцованный сдвиговый регистр. 

always @(posedge clk)
	if (!res) q = 8'b10000000;
	else if (sEV) q <= {q[6:0], q[7]};

Разве что выделитель спада для запуска можно какой-нибудь одной строчкой причесать, но всё равно квартус оптимизирует как надо.

Правда - зачем-то он 1 LE потратил дополнительно...

 

PS поправил имена сигналов.

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

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


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

Quote

так Вы ж это уже описали - закольцованный сдвиговый регистр. 

Нее, Вы меня не поняли.

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

А я хочу что-бы RTL показал как у меня в схеме - восемь триггеров последовательно. Это возможно?

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


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

26 minutes ago, zombi said:

автомат потребует больше ресурсов чем просто девять триггеров

можно написать другой автомат, без выходного сдвигового регистра. 

Выходы можно сделать из логики и переменной state. Должно хватить 4 триггеров. Если убрать оптимизацию по скорости.

14 minutes ago, zombi said:

Это возможно?

у MAXII в LE стоит таблица LUT перед каждым триггером - ее вроде бы никак не обойти, как ни пиши код. Т.е. на вход D сигнал может попасть через эту таблицу.

Вроде так, насколько я понимаю внутреннее устройство этой микросхемы. Наверное, квартус рисует ее в виде мультиплексора.

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

Может, если покопаться в настройках - там где разрешается/запрещается оптимизация, но не уверен.

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


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

11 minutes ago, Yuri124 said:

Можете попробовать в лоб - расписать каждый триггер  по отдельности

Два модуля написать, один для младших 7-ми разрядов и один для старшего?

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


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

как мне правильно описать асинхронный сброс/установку для таких модулей? Извините если спрашиваю глупость...

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


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

always @ (posedge clock_sys or res)
        if (! res) q <= ...;
        else ...

 

Вроде так. Но истинно асинхронный сброс/установка - чреваты.

 

Посмотрите серию статей Иосифа Каршенбойма по Verilog. https://kit-e.ru/circuit/kratkij-kurs-hdl-chast-2-1-opisanie-yazyka-verilog/

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


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

 

15 minutes ago, Yuri124 said:

истинно асинхронный сброс/установка - чреваты.

Ясно мне чисто попробовать. :biggrin: просто друг интересуется...:boredom:

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


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

Вот это

module myshiftREG (input res,clk,EV, output reg [7:0] q );
reg A;
wire sEV = (!EV & A) | !q[7];
always @(posedge clk) A <= EV;
always @(posedge clk or negedge res)
	if (!res) q <= 8'b10000000;
	else if (sEV) q <= {q[6:0], q[7]};
endmodule

компилируется в это

TLE - 9 / Fmax - 266.74 MHz

A1.jpg

 

А это

module myshiftNEW (input res,clk,EV,output reg [7:0] q);
reg A;
wire sEV = (!EV & A) | !q[7];
always @(posedge clk) A <= EV;
always @(posedge clk)
	if (!res) q = 8'b10000000;
	else if (sEV) q <= {q[6:0], q[7]};
endmodule

в это

TLE - 10 / Fmax - 267.17 MHz

A2.jpg

Котэ в шоке!!!

ВЕРИЛОГ - СИЛА!

И чего я до сих пор с кубиками игрался :dash2:?

 

Ну и конечный автомат из последнего кода Конечный автомат, для полноты эксперимента.

TLE - 17 / Fmax - 262.33 MHz

A3.jpg

 

Вывод: по частоте выбирай любой, по ресурсам... хотя, кто сейчас ресы экономит )

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


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

Вот еще вчера шел вечером по улице и подумал - как сократить автомат

module myshift_NEW_2 (input res, clk, ev, output reg [7:0] q);
    

reg [1:0] state, next_state;
parameter IDLE1 = 0,
                SHIFT =  1,
                IDLE2  = 2;

always @ (posedge clock_sys or negedge res)
        if (! res) state <= IDLE;
        else state <= next_state;

always @ (*)
        begin
           //next_state = 'bx;
                        
            case (state)            
                IDLE:     begin
                                 if (ev) next_state = IDLE;
                                 else next_state = SHIFT;
                            end
               SHIFT:  begin

                            if (! q [7]) next_state = SHIFT;

                            else if (! ev) next_state = IDLE2;

                           else next_state = IDLE1;

               IDLE2:  next_state = IDLE1;

               default: next_state = IDLE1;
            endcase
        end

always @ (posedge clock_sys or negedge res)
            if (! res)    begin
                                        q <= 8'b10000000;   
                            end
            else
                                        
                    case (next_state)
                    
                        IDLE1:     ;  // можно эту строку написать IDLE:     q <= 8'b10000000;  при этом в случае сбоя бита в цепочке регистров  гарантированный возврат в правильное исходное состояние
                        SHIFT: q <= {q[6:0], q[7]};
                        IDLE2: ;      
                                          
                    endcase
                 

endmodule

 

Вроде как должно работать.

 

Если сделать автомат из многих состояний (8-9) и закодировать эти состояния соответствующим образом, а потом через эти состояния описать выходы - то по идее должно получиться без сдвигового регистра и без лишних регистров - т.е минимальная аппаратная конфигурация по триггерам. Но, возможно, за счет большего объема требуемой логики потребуются  дополнительные логические ресурсы (без триггеров), и всё равно будут задействованы дополнительные LE.

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

(что-то расстояние между строками увеличилось после enter...)  - оппа, само поправилось.

14 hours ago, zombi said:

И чего я до сих пор с кубиками игрался

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

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

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


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

5 hours ago, Yuri124 said:

подумал - как сократить автомат

Попытался "скормить" Ваш код квартусу.

Были ошибки : отсутствовал END (перед default), clock_sys заменил на clk, в двух строках был IDLE без цифры - добавил 1. Ошибки пропали кроме одной :

"Error (10163): Verilog HDL error at myshift_new_2.v(26): illegal name "IDLE2" used in expression"


Вот во что я, позволив себе вольность, отредактировал код:

module myshift_NEW_2 (input res, clk, ev, output reg [7:0] q);
    

reg [1:0] state, next_state;
parameter IDLE1 = 0,
                SHIFT = 1,
                IDLE2 = 2;

always @ (posedge clk or negedge res)
        if (! res) state <= IDLE1;
        else state <= next_state;

always @ (*)
        begin
           //next_state = 'bx;
                        
            case (state)            
                IDLE1:     begin
                                 if (ev) next_state = IDLE1;
                                 else next_state = SHIFT;
                            end
               SHIFT:  begin

                            if (! q [7]) next_state = SHIFT;

                            else if (!ev) next_state = IDLE2; // <<<<<< (26) на эту строку ругается >>>>>>>

                           else next_state = IDLE1;

               IDLE2:  next_state = IDLE1;
			   end
               default: next_state = IDLE1;
            endcase
        end

always @ (posedge clk or negedge res)
            if (! res)    begin
                                        q <= 8'b10000000;   
                            end
            else
                                        
                    case (next_state)
                    
                        IDLE1:     ;  // можно эту строку написать IDLE:     q <= 8'b10000000;  при этом в случае сбоя бита в цепочке регистров  гарантированный возврат в правильное исходное состояние
                        SHIFT: q <= {q[6:0], q[7]};
                        IDLE2: ;      
                                          
                    endcase
                 

endmodule

 

Кста, а подскажите пжл как увеличить размер шрифта в окне ввода текста?

Монитор большой, шрифт малюсенький. Все глаза уже сломал :shok:

На блок-схеме я колесо мыши кручу, или лупу выбираю.

А тут ну никак. Искал в настройках как шрифт поменять - не нашел (

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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