LINUX.ORG.RU

Реализовать протокол DHT11 на верилоге

 


0

2

Привет!
Назрела насущная задача: необходимо реализовать протокол dht11 на верилоге для симуляции датчика температуры и влажности.
Вот даташит на протокол: http://robocraft.ru/files/datasheet/DHT11.pdf
Собственно возникли следующие вопросы, тк я привык работать только с синхронной логикой и с синтезируемым кодом:
1) Как в асинхронной логике выдержать заданный промежуток времени? В реальной железке там скорее всего стоит собственный счетчик, который отмеряет время, но как быть в симуляции?
2) Как в симуляции сделать inout порт? При программировании для фпга я бы инстанциировал iobuf. Получится ли тут сделать что-то вроде

module test(
    inout port
);
    reg out = 0;
    reg data = 1;
    assign port = (out) ? data : 1'Z;
    always @ ( inout )
    begin
        out = port;
    end
endmodule
В тред призываются неравнодушные: DR_SL, I-Love-Microsoft, ncrmnt

Deleted

Последнее исправление: SMD (всего исправлений: 1)

1) Как в асинхронной логике выдержать заданный промежуток времени? В реальной железке там скорее всего стоит собственный счетчик, который отмеряет время, но как быть в симуляции?

Вот неплохая pdf'ка по теме: http://www.sunburst-design.com/papers/CummingsHDLCON1999_BehavioralDelays_Rev1_1.pdf

2) Как в симуляции сделать inout порт? При программировании для фпга я бы инстанциировал iobuf. Получится ли тут сделать что-то вроде

Можно и при симуляции инстанциировать iobuf. VHDL поддерживает «weak»-сигналы - т.е. симуляция подтяжки линии. У верилога тоже что-то про подтяжку есть.

Kosyak ★★★★
()

Счетчик, регистр сравнения и стейт-машина. Как еще?

Но лучше скажи - нафейхуа это с плисины делать?

ncrmnt ★★★★★
()
Последнее исправление: ncrmnt (всего исправлений: 1)
Ответ на: комментарий от Deleted

1) Выше уже ответили, что в самом деле - стейт машина, счетчик и так далее. На самом деле это всё чудовищно просто, но признаюсь что я сам, много лет назад, когда только осваивал ПЛИС и Verilog, тоже сильно терялся в таких простых вещах...

Очень советую сайт: http://www.fpga4fun.com - там классные полезные примеры с очень подробным описанием.

2) А на стороне симуляции - 100% так же как внутри синтезируемой части. Не нужны никакие примитивы, зависимые от вендора - сам Verilog это позволяет на уровне языка.

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

1) Выше уже ответили, что в самом деле - стейт машина, счетчик и так далее. На самом деле это всё чудовищно просто, но признаюсь что я сам, много лет назад, когда только осваивал ПЛИС и Verilog, тоже сильно терялся в таких простых вещах...

Да, для меня это стейтмашина, счетчик и тд, когда есть источник ивентов ака клок. А в рассматриваемом протоколе ивент будет переход сигнала в 0 и от этого момента надо как-то отсчитать 20мс. Я понимаю, как это сделано в железке, но вот как сделать в симуляции?
Папиру выше еще не читал, сейчас начну.

Deleted
()
Ответ на: комментарий от Deleted

Я понимаю, как это сделано в железке, но вот как сделать в симуляции?

Я делаю точно так же как и в железке: http://www.testbench.in/TB_08_CLOCK_GENERATOR.html

50 МГц например

initial clk = 0;
always #10 clk = ~clk;

initial begin
// ... делаем что-то
repeat(1000000) @(posedge clk);
// ... спустя 20 миллисекунд
end

Можно и так:

initial begin
// ... делаем что-то
#20000000;
// ... спустя 20 миллисекунд
end

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Deleted

Иными словами, Verilog для НЕ-синхронной логики и НЕ-синтезируемых конструкций, ну вообще ничем не отличается от обычного языка программирования - ключевой момент. Знай себе пиши последовательные какие-то действия, вызывай функции и т.д.

Почитай тут: http://testbench.in/TB_00_INDEX.html - очень хорошие примеры. Всё тут - несинтезируемо и асинхронно.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Спасибо!
А насчет подтяжки линии и inout порта подскажи, пожалуйста, кейворды, по которым надо гуглить и искать.

Deleted
()
Ответ на: комментарий от Deleted

А насчет подтяжки линии и inout порта подскажи, пожалуйста, кейворды, по которым надо гуглить и искать.

Verilog pullup

Вот так примерно должно выглядеть со стороны датчика:

module dht11_bfm(
    inout sda,
    inout scl
);
reg out_sda;
reg out_scl;
sda = out_sda ? 1'bZ : 1'b0;
sda = out_scl ? 1'bZ : 1'b0;
// Дальше собсно код модели
Потом в общем тест-бенче:
wire sda;
wire scl;

dht11_bfm(.sda(sda), .scl(scl));
pullup(sda);
pullup(scl);

Kosyak ★★★★
()
Ответ на: комментарий от abacaba

Во дела, не знал, думал лишь в единицах, зависящих от настроек timescale...

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.