vovundel 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Здравствуйте, на вход приходит вот такая последовательность, старт - это "ничего", по этому ничего мы определяем что это начало нашей последовательности а дальше импульсы: - тоненькие 80 ms - 0 - толстенькие 180 ms - 1 мне их нужно в регистр, и поэтому счётчиком до 4 и сдвиговым регистром, мой вопрос: как мне распознать "старт" и его на RST ? как распознать "0" и "1" что бы их "сдвигать" ? `timescale 1ns / 1ps module zahler8(RST, CLK, Q); input RST, CLK; output reg [3:0] Q; always @(posedge CLK or posedge RST) begin if (RST | Q == 4'b1000) Q <= 4'b0; else if (CLK) Q <= Q + 1; end endmodule module uhr(RST, CLK, A, S); input RST; input CLK; input A; output reg [4:0] S; always @(posedge RST) begin S <= 4'b0; end zahler8(RST, CLK, Q); always @(posedge CLK) begin if (A) S <= S + 1; else S = S << 1; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FalloutMan 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Что-то из описания я тоже не понял, почему старт там где его нарисовали, а не вдругом месте. старт - это "ничего", по этому ничего мы определяем что это начало нашей последовательности т.е. каждый раз когда не приходит импульс мы делаем старт? После каждого импульса заного что ли. Не понимаю. Не экономьте слова, опишите все как можно подробнее. Разъясните подробнее про старт и ресет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба мой вопрос: как мне распознать "старт" и его на RST ? как распознать "0" и "1" что бы их "сдвигать" ? Когда входной сигнал =0 включаете счетчик. При превышении порога - "старт". Делаете счетчик, который считает когда входной сигнал =1. По заднему фронту сравниваете с пороговым значением: если больше - то 1, меньше - 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Фактически "старт" должен начинаться с приходом первого импульса после паузы. Отсчитает нужное количество импульсов (в данном примере 4), и ждет нового "старта". А распознать 0 и 1 - после каждого фронта запускать счетчик, который посчитает до 130 ns и после этого прочитать сигнал. Если там 0 - значит 0, если 1 - сами знаете, что :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovundel 0 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба (сегодня немного разьяснили) на вход могут приходить только 3 вида импульсов, 1) импульс 80 ms - это 0 2) импульс 180 ms - это 1 3) нет импульса - это и есть старт (ресет) извините, а По заднему фронту сравниваете с пороговым значением... это как сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба По заднему фронту сравниваете с пороговым значением... это как сделать? Ну как, увидели задний фронт, сравнили длительность с порогом (например 130). Если больше - то 1, меньше - 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovundel 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба "увидели задний фронт, сравнили длительность с порогом (например 130)..." поделитесь небольчим примерчиком... - именно как смотреть на вход в определенное время? - как считать длительность импулсика? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
honinbo 2 19 мая, 2010 Опубликовано 19 мая, 2010 (изменено) · Жалоба Импульсы идут через постоянный интервал. 0 - короткий импульс, 1- длинный импульс, ресет- отсутствие импульса. Так? А где тактовая частота? По ней и считаются события. Наличие импульса и его длительность. В "определенное время" - по фронту тактового импульса. Изменено 19 мая, 2010 пользователем honinbo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба поделитесь небольчим примерчиком... - именно как смотреть на вход в определенное время? - как считать длительность импулсика? always @(posedge clk) begin // зачитали вход reg_in <= {in, reg_in[2:1]}; // длительность 1 if (reg_in[0]) len1 <= 'b0; else len1 <= len1 + 1'b1; // выход if (reg_in[1:0] == 2'b10) if (len1 < 130) out <= 1'b0; else out <= 1'b1; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovundel 0 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба спасибо, разобрался! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovundel 0 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба подскажите как смоделировать тест: последовательно 20 значений как по "красивее" это сделать? как это обычно делают? `timescale 1ns / 1ps module testbed; reg CLK; reg in; wire out; wire RST; uhr uut ( .CLK(CLK), .in(in), .out(out), .RST(RST), ); initial begin CLK = 1; forever #1 CLK = ~CLK; end reg [20:0] arr; integer ind; always @(CLK) begin integer ind; arr = 20'b0101100; for (ind = 0; ind < 20; ind = ind +1) if (arr[ind] == 1) #3 in = 1; else #5 in = 0; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FalloutMan 0 23 мая, 2010 Опубликовано 23 мая, 2010 · Жалоба подскажите как смоделировать тест: последовательно 20 значений как по "красивее" это сделать? как это обычно делают? Вот обычно в тесте покрасивее не делают. А делают как побыстрее. вот например так: `timescale 1ns / 1ps module testbed; reg CLK; reg in; wire out; wire RST; uhr uut ( .CLK(CLK), .in(in), .out(out), .RST(RST), ); initial begin CLK = 1; in=0; forever #1CLK = ~CLK; end initial begin CLK = 1; in=0; forever begin #180in = 1; #80in = 0; #400in=1; #500in=0; end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться