Neadequant 0 16 февраля, 2013 Опубликовано 16 февраля, 2013 · Жалоба Всем привет! Я новичок и разбираюсь с Verilog'ом, да и вообще с электроникой. Задача такая: описать синхронную схему порогового сравнения 8-разрядных чисел с порогом, задаваемым через параметр. Вот мой код и результат симуляции: module comparator_8bit (compout_1, compout_2, A, B); parameter size = 8; parameter threshold = 64; //пороговая величина input [size-1:0]A; input [size-1:0]B; output compout_1; output compout_2; assign compout_1 = (A == threshold); assign compout_2 = (B == threshold); endmodule Вопрос: правильно ли работает программа, нужно что-то в коде менять ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 16 февраля, 2013 Опубликовано 16 февраля, 2013 · Жалоба Приветствую! В принципе правильно, но нужно уточнить понятие "пороговый" компаратор поскольку у Вас скорее всего получился просто просто компаратор на фикс значение наверное нужно было сделать assign compout_1 = (A >= threshold); или assign compout_2 = (B < threshold); это более соответствует термину "пороговый". Но это Вам по условию задачи должно быть виднее. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doublekey 0 16 февраля, 2013 Опубликовано 16 февраля, 2013 · Жалоба Вы описали асинхронную схему, а по условию задачи вроде бы нужна синхронная. Поэтому, следует добавить вход частоты синхронизации, назвав его, например, clk, описать выходы как reg, а также добавить always @(posedge clk). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neadequant 0 17 февраля, 2013 Опубликовано 17 февраля, 2013 (изменено) · Жалоба Спасибо за замечания. В общем, переделал прогу так: module compare_8bit_v3 (A, B, clk, compout_A, compout_B); parameter size = 8; parameter threshold = 150; input [size-1:0]A; input [size-1:0]B; input clk; output compout_A; output compout_B; reg compout_A; reg compout_B; always @ (negedge clk) begin if (A >= threshold) compout_A = 1; else compout_A = 0; if (B >= threshold) compout_B = 1; else compout_B = 0; end endmodule Не совсем понимаю два момента: 1) Когда использую регистры, не работают конструкции с assign. Так и должно быть ? 2) У меня сейчас синхронизация по отрицательному фронту clk. Как правильнее - по отрицательному или по положительному фронту, или без разницы ? Изменено 17 февраля, 2013 пользователем Neadequant Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 17 февраля, 2013 Опубликовано 17 февраля, 2013 · Жалоба 1) Когда использую регистры, не работают конструкции с assign. Так и должно быть ? 2) У меня сейчас синхронизация по отрицательному фронту clk. Как правильнее - по отрицательному или по положительному фронту, или без разницы ? 1 - Все правильно, assign это, грубо-говоря, подключение провода (wire) к комбинаторной конструкции. А если данные записываются в регистр - нужно указать по какому фронту какого клока это делать. 2 - Если абстрактно - то правильно по тому фронту, по которому у вас весь дизайн построен. Однако, в большинстве случаев работают по положительному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться