Перейти к содержанию
    

входной сигнал

Здравствуйте,

 

на вход приходит вот такая последовательность,

старт - это "ничего", по этому ничего мы определяем что это начало нашей последовательности

а дальше импульсы:

- тоненькие 80 ms - 0

- толстенькие 180 ms - 1

 

x_fd5f6d3d.jpg

 

мне их нужно в регистр, и поэтому счётчиком до 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то из описания я тоже не понял, почему старт там где его нарисовали, а не вдругом месте.

старт - это "ничего", по этому ничего мы определяем что это начало нашей последовательности

т.е. каждый раз когда не приходит импульс мы делаем старт? После каждого импульса заного что ли. Не понимаю. :wacko:

 

Не экономьте слова, опишите все как можно подробнее.

Разъясните подробнее про старт и ресет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мой вопрос:

как мне распознать "старт" и его на RST ?

 

как распознать "0" и "1" что бы их "сдвигать" ?

Когда входной сигнал =0 включаете счетчик. При превышении порога - "старт".

Делаете счетчик, который считает когда входной сигнал =1. По заднему фронту сравниваете с пороговым значением: если больше - то 1, меньше - 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фактически "старт" должен начинаться с приходом первого импульса после паузы. Отсчитает нужное количество импульсов (в данном примере 4), и ждет нового "старта".

А распознать 0 и 1 - после каждого фронта запускать счетчик, который посчитает до 130 ns и после этого прочитать сигнал. Если там 0 - значит 0, если 1 - сами знаете, что :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(сегодня немного разьяснили)

 

на вход могут приходить только 3 вида импульсов,

1) импульс 80 ms - это 0

2) импульс 180 ms - это 1

3) нет импульса - это и есть старт (ресет)

 

извините, а

 

По заднему фронту сравниваете с пороговым значением...

 

это как сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По заднему фронту сравниваете с пороговым значением...

 

это как сделать?

Ну как, увидели задний фронт, сравнили длительность с порогом (например 130). Если больше - то 1, меньше - 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"увидели задний фронт, сравнили длительность с порогом (например 130)..."

 

поделитесь небольчим примерчиком...

- именно как смотреть на вход в определенное время?

- как считать длительность импулсика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Импульсы идут через постоянный интервал. 0 - короткий импульс, 1- длинный импульс, ресет-

отсутствие импульса. Так?

А где тактовая частота?

По ней и считаются события. Наличие импульса и его длительность.

В "определенное время" - по фронту тактового импульса.

Изменено пользователем honinbo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поделитесь небольчим примерчиком...

- именно как смотреть на вход в определенное время?

- как считать длительность импулсика?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите как смоделировать тест: последовательно 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите как смоделировать тест: последовательно 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...