Тема называется "вопросы по Verilog", а вопросов и не видно. Только "помогите". Может, для начала как-то описательную часть топика сформулировать? Что за устройство, какое ТЗ, с кем общается. А то сходу - какой-то модуль.
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Общается, стоит на плате модуля дискретного ввода(8-ми канальный)плата индикиции и тд.
Я немного не понимаю.
Вот допустим тириггер описывается в прошивке, или выводы просто описываются на AHDL: DAT0 = TRI(D0,!CS&!RD); % сигнал с выхода трехразрядного буфера TRI подается на I/O порт % DAT1 = TRI(D1,!CS&!RD); DAT2 = TRI(D2,!CS&!RD); DAT3 = TRI(D3,!CS&!RD); DAT4 = TRI(D4,!CS&!RD); DAT5 = TRI(D5,!CS&!RD); DAT6 = TRI(D6,!CS&!RD); DAT7 = TRI(D7,!CS&!RD);
% соединение порта D защелок с DAT[]&RESET % IN_REG[8..1].D = DAT[7..0]; % соединения выполняются одновременно % IN_REG[].CLK = LCELL(!WR); IN_REG[8..1].ENA = (!CS&(A[]==8)); IN_REG[].CLRN = LCELL(RESET);
А в скобках что описывается? Какие-то условия подачи сигнала? Сейчас о первой части.
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
DAT0 = TRI(D0,!CS&!RD); % сигнал с выхода трехразрядного буфера TRI подается на I/O порт % ... DAT7 = TRI(D7,!CS&!RD);
Тут хорошо идёт С-шная тернарная операция ?:
Код:
assign DAT =!CS &&!RD ? D : 8bz;
Nevox писал(а):
% соединение порта D защелок с DAT[]&RESET % IN_REG[8..1].D = DAT[7..0]; % соединения выполняются одновременно % IN_REG[].CLK = LCELL(!WR); IN_REG[8..1].ENA = (!CS&(A[]==8)); IN_REG[].CLRN = LCELL(RESET);
Тут posedge WR если запись в регистр по фронту WR. По фрагменту AHDL получается, что запись по спаду, так что negedge. Сброс низким уровнем на RESET
Код:
always @(negedge WR or negedge RESET) begin if (RESET == 0) INREG <= 0; else if (!CS && A == 8) INREG <= DAT; end
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
В первом сообщении D это input wire, тут уже другой D ? Можно так же через И/ИЛИ, но это неинтересно. Можно так:
Код:
wire [7:0] D; assign D = A[3:0] == 0 ? 8'd32 : A[3:0] == 1 ? 8'd28 : A[3:0] == 2 ? 8'd8 : A[3:0] == 3 ? 8'd8 : A[3:0] == 4 ? 0 : A[3:0] == 5 ? 0 : A[3:0] == 6 ? 0 : A[3:0] == 7 ? 0 : A[3:0] == 8 ? IN_REG : 0; // но ведь в оставшихся случаях тоже 0, зачем в исходном для 4..7 отдельно было?
Можно так:
Код:
reg [7:0] D_reg; assign D = D_reg; // ну или тут тоже через ?: третье состояние врезать или что другое // Или сразу объявить D регистром, триггера тут не будет, если не забіть про // default. Если забыть, получится LATCH always @(*) case (A[3:0]) 0: D_reg = 8'd32; 1: D_reg = 8'd28; 2: D_reg = 8'd8; 3: D_reg = 8'd8; 8: D_reg = IN_REG; default: D_reg = 0; endcase
Однако вопрос -- что-то почитать по veilog пробовали?
Ладно, вчера (после 13-часовой отрисовки схем в воскресенье) сделал себе выходной, потоптался на форумах, а сегодня пора и за работу.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
да,читаю кучу всего,в том числе и книги на английском. Просто из-за изобилия информации все идет не сразу, поэтому и спрашиваю параллельно на форуме. По конкретному примеру легче разобраться.
Погуглите слова evita verilog, у них были презенташки-слайды на десяток страниц по основным операциям, хороши для быстрого старта. Но потом всё равно что-то посерьёзнее найдите почитать.
Я, по обыкновению своему, после короткого вступления сразу в стандарт лезу, но оно суховато идёт с непривычки
О, ещё на сайте у Иосифа Каршенбойма цикл статей «Краткий курс HDL-кодирования» тоже, на мой взгляд, неплохо для начинающих.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
2.5.1 Integer constants If the size of the unsigned number is smaller than the size specified for the constant, the unsigned number shall be padded to the left with zeros. If the leftmost bit in the unsigned number is an x or a z, then an x or a z shall be used to pad to the left respectively.
т.е. 8'bZ0 даст 8'bZZZZZZZ0, 8'b10 даст 8'b00000010
p.s. Ага, я там в первом сообщении апостроф непробил в 8'bz
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Где-то выше я что-то похожее, хоть и попроще, уже переводил. Как-то так:
Код:
always @(negedge WR or negedge RESET) if (!RESET) IN_REG <= 0; else if (!CS) begin if (A == 8) IN_REG[ 7:0] <= DAT; if (A == 9) IN_REG[13:8] <= DAT[5:0]; end
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Кстати, исходные AHDL файлы могли бы быть и покрасивее. Т.е. понятнее и сопровождаемее, при этом код генерировался бы или вообще точно такой же, или слегка другой, но с тем же действием. Например, это (мне лень переписывать, поэтому я бросаю кусочки своего кода):
Тут HDMOD_100ms и компания -- именованные константы Или через CASE
Код:
sequ.(clk,reset) = (Clk,Reset);
CASE sequ IS WHEN Idle => IF CyReq THEN sequ = CYras; ELSIF RefEn & RefReq THEN sequ = RFcas; ELSE sequ = Idle; END IF; WHEN CYras => sequ = CYmux; WHEN CYmux => sequ = CYcas; ...
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
case (A) 4'b0000: D = 8'b00010000; 4'b0001: D = 8'b00100001; 4'b0010: D = 8'b00010000; 4'b0011: D = 8'b00001000; 4'b1000: D = IN[7:0]; 4'b1010: D = IN[15:8]; default: D = 8'b00000000; endcase endmodule
в итоге показывается в программе,что светодиоды каналов [8:15] горят,а на модуле не горят. нужно чтобы не горели,что не так?
Это неэквивалентные куски кода. В AHDL-ном по D[] идёт просто комбинационная схема, а в verliog-ном -- регистры по спаду WR. Надо так:
Код:
always @(*) // * - любое изменение любого сигнала case (A) 4'b0000: D = 8'b00010000; 4'b0001: D = 8'b00100001; 4'b0010: D = 8'b00010000; 4'b0011: D = 8'b00001000; 4'b1000: D = IN[7:0]; 4'b1010: D = IN[15:8]; default: D = 8'b00000000; endcase
D всё равно объявлять как reg. Тут это просто переменная, сохраняющая для verilog-машины своё состояние между выполнениями блока always. Он выполняется при любом изменении любого входа, поэтому данные сразу проходят на выход и нет регистра в смысле цифровых схем. Если забыть ветку default, то будет регистр-защёлка (LATCH), помнящий состояние D пока A гуляет по всем не перечисленным комбинациям.
_____ Тьху, я и в этой теме успел на стандарт сослаться.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Хотелось бы написать прошивку для модуля ввода(стоит Альтера epm3064 на 44 пина),чтобы при замене на горячую,ложная информация не уходила,пока не успели подключить провода. а как-нибудь пропускались бы биты и потом можно было бы считывать достоверную информацию,или что-нибудь в этом роде. прошу прощения за немного кривой язык.
вот пример прошивки,которая есть щас,написанная на Verilog.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения