zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 41 minutes ago, Yuri124 said: Это вряд ли. Все диаграммы как близнецы и братья!!! Ещё раз проверил все варианты. И добавил новый фронт EV пока сдвиг не завершился, хотя у меня такой случай невозможен. Все варианты при таком повторном появлении фронта EV ведут себя одинаково. Картинку поведения прилагаю. 51 minutes ago, Yuri124 said: Разница в скорости - вероятно, логика разная в проектах. Сейчас я просто тестирую. Проект содержит только один единственный блок из трёх вариантов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 14 июля, 2020 Опубликовано 14 июля, 2020 (изменено) · Жалоба 32 minutes ago, zombi said: диаграммы как близнецы и братья!!! Да, точно, был не прав - я упустил старший разряд регистра, который не дает остановиться ему и перезапуститься до окончания полного цикла. да и даже если бы перезапустился - сдвиг бы просто продолжился. про логику разную в проектах - имел в виду, что в реализации моего автомата логики навернуто должно быть больше. Вы смотрели отчет - автомат сколько бит реализован? - там таблица должна быть скорее всего из 16 строк и 16 столбцов, и единица бежит по диагонали. А если убрать строку default (в реале это м.б. чревато) - меняется что-то по ресурсам и скорости? И если убрать в проекте с автоматом оптимизацию по скорости, ресурсам и мощности. Если к автомату вместо EV прикрутить как у Вас выделитель фронта (спада), то можно уменьшить число стостояний с 9 до 8 - будет только 3 бита, тогда ресурсов в режиме оптимизаци по скорости потребуется меньше (думаю) и упростится логическая обвязка внутри квартуса. Правда - при этом проще как у Вас описать этот сдвиговый регистр, а не расписывать автомат. Просто интересно по ресурсам и быстродействию что станет :) Изменено 14 июля, 2020 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба Спасибо. Ясно что автомат потребует больше ресурсов чем просто девять триггеров. И понятно что его легко адаптировать под новую задачу. А можете с этим помочь? 1 hour ago, zombi said: 2.Кто может помочь описать схему из третьего теста на верилоге? хочу её тоже прогнать но на верилоге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 14 июля, 2020 Опубликовано 14 июля, 2020 (изменено) · Жалоба 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 поправил имена сигналов. Изменено 14 июля, 2020 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба Quote так Вы ж это уже описали - закольцованный сдвиговый регистр. Нее, Вы меня не поняли. То что я написал на верилоге смотрю в RTL и вижу на выходе блока восемь регистров, и перед каждым по два мультиплексора - один для сброса и один для нового состояния. А я хочу что-бы RTL показал как у меня в схеме - восемь триггеров последовательно. Это возможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 26 minutes ago, zombi said: автомат потребует больше ресурсов чем просто девять триггеров можно написать другой автомат, без выходного сдвигового регистра. Выходы можно сделать из логики и переменной state. Должно хватить 4 триггеров. Если убрать оптимизацию по скорости. 14 minutes ago, zombi said: Это возможно? у MAXII в LE стоит таблица LUT перед каждым триггером - ее вроде бы никак не обойти, как ни пиши код. Т.е. на вход D сигнал может попасть через эту таблицу. Вроде так, насколько я понимаю внутреннее устройство этой микросхемы. Наверное, квартус рисует ее в виде мультиплексора. Можете попробовать в лоб - расписать каждый триггер по отдельности, соединить их в цепочку - но не думаю, что что-то изменится, квартус довольно умная штука. Может, если покопаться в настройках - там где разрешается/запрещается оптимизация, но не уверен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 11 minutes ago, Yuri124 said: Можете попробовать в лоб - расписать каждый триггер по отдельности Два модуля написать, один для младших 7-ми разрядов и один для старшего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 9 minutes ago, zombi said: Два модуля для чистоты эксперимента - 8 штук, и потом соединить их. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба как мне правильно описать асинхронный сброс/установку для таких модулей? Извините если спрашиваю глупость... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 15 minutes ago, Yuri124 said: истинно асинхронный сброс/установка - чреваты. Ясно мне чисто попробовать. просто друг интересуется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба Вот это 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 А это 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 Котэ в шоке!!! ВЕРИЛОГ - СИЛА! И чего я до сих пор с кубиками игрался ? Ну и конечный автомат из последнего кода Конечный автомат, для полноты эксперимента. TLE - 17 / Fmax - 262.33 MHz Вывод: по частоте выбирай любой, по ресурсам... хотя, кто сейчас ресы экономит ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 175 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 1 час назад, zombi сказал: ВЕРИЛОГ - СИЛА! Неплохой букварь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 15 июля, 2020 Опубликовано 15 июля, 2020 (изменено) · Жалоба Вот еще вчера шел вечером по улице и подумал - как сократить автомат 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: И чего я до сих пор с кубиками игрался спасибо за Ваши отчеты, интересно. Не задумывался как-то как реализуется при разных сбросах, интересно. Изменено 15 июля, 2020 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 15 июля, 2020 Опубликовано 15 июля, 2020 · Жалоба 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 Кста, а подскажите пжл как увеличить размер шрифта в окне ввода текста? Монитор большой, шрифт малюсенький. Все глаза уже сломал На блок-схеме я колесо мыши кручу, или лупу выбираю. А тут ну никак. Искал в настройках как шрифт поменять - не нашел ( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться