bmangust 0 28 марта, 2011 Опубликовано 28 марта, 2011 · Жалоба Собственно, в этом коде Quartus выадет ошибку 10028 (а именно, во втором блоке "always @"): // decrement number (ram), recieved from shift_register // and synchronously increment binary counters "units", "tens", "hundreds", "thousands". // then unite them into BCD number. // when ram == 0, send signal (cs_down) to the shift_register to collect new data module converter ( input [11:0] data_in, // data from shift_register ([11:0] sr) input clk, ready, // "ready" signal from the shift_register.v output reg [14:0] disp_BCD, // display memory, binary-coded decimal //([14:12] - thousands, [11:8] - hundreds, [7:4] - tens, [3:0] - units) output reg cs_down // to the shift_register.v ); reg [3:0] units = 4'hx; // units counter reg [3:0] tens = 4'hx; // tens counter reg [3:0] hundreds = 4'hx; // hundreds counter reg [2:0] thousands = 3'hx; // thousands counter reg [11:0] ram; // declare RAM, dercement counter wire units_over = (units [3:0] == 4'h0); wire tens_over = (tens [3:0] == 4'h0) & units_over; wire hundreds_over = (hundreds [3:0] == 4'h0) & tens_over; always @ (negedge clk) if (ready) begin ram <= data_in; // Write data to memory units <= 4'bx; // and clear counters tens <= 4'bx; // 4'bx used to avoid unexpected increments hundreds <= 4'bx; thousands <= 3'bx; end else; always @ (posedge clk) if (ram == 12'b0) cs_down <= 1'b1; else begin ram <= ram - 1'b1; cs_down <= 1'b0; if (units == 4'b1011) units <= 4'b0000; else units <= units + 1'b1; end always @ (posedge units_over) if (tens == 4'b1011) tens <= 4'b0000; else tens <= tens + 1'b1; always @ (posedge tens_over) if (hundreds == 4'b1011) hundreds <= 4'b0000; else hundreds <= hundreds + 1'b1; always @ (posedge hundreds_over) if (thousands == 3'b100) thousands <= 3'b000; else thousands <= thousands + 1'b1; always @ (negedge cs_down) disp_BCD <= {thousands, hundreds, tens, units}; endmodule Что ожидается от схемы: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 28 марта, 2011 Опубликовано 28 марта, 2011 · Жалоба Не нравится то, что пытаетесь работать с триггером и по фронту и посрезу одновременно или вообще по нескольким тактовым одновременно. Таких триггеров в ПЛИС нет. Пользуйтесь одной тактовой частотой и разрешающими сигналами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 марта, 2011 Опубликовано 28 марта, 2011 · Жалоба Здесь ошибка не столько, что по срезу и по фронту, а что переменная изменяется в нескольких блоках. Должно быть все в одном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmangust 0 28 марта, 2011 Опубликовано 28 марта, 2011 · Жалоба спасибо, буду в следующий раз избегать этого :) тогда еще вопрос: можно ли внутри ПЛИС использовать значения "хххх" вместо чисел? Квартус как бы предупреждает и еще выдал вот что: Warning: Circuit may not operate. Detected 19 non-operational path(s) clocked by clock "clk" with clock skew larger than data delay. See Compilation Report for details. Type: Clock Hold: 'clk' Slack: Not operational: Clock Skew > Data Delay Required Time: None Actual Time : N/A From: thousands[1] //тут стоят все биты регистров "units", "tens", "hundreds", "thousands" To: thousands[1] //тут стоят все биты регистров "units", "tens", "hundreds", "thousands" From clock: clk To clock: clk Failed Paths: 19 тут имеется в виду то, что при тактировании схемы сигналом с высокой частотой регистры не смогут вовремя переключиться? Или при любой частоте тактирования регистры не будут успевать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться