1-wire主机ds1wm,称作1wm,创建它是为了便于实现主机cpu通过1-wire总线与器件进行通信,而无须涉及位时序操作。本应用指南阐述如何将1 wire主机(1wm)嵌入到用户asic设计之中。本文提到的ds89c200只是一个理论上的微控制器,另外,假定读者已经具备了1-wire主机ds1wm和1-wire协议的一般知识。如欲了解更详细信息,请参阅[1]ibutton标准手册(book of ibutton standard)和[2]ds1wm数据资料(ds1wm datasheet)。
结构
ds1wm排列象一个顶级的甲胄,连接四个子模块,构成一个完整的单元。在这个顶级的甲胄中并没有hdl代码。四个子模块分别是:one_wire_interface、one_wire_master 、clk_prescaler和one_wire_io。对于那些不需要时钟分频器的应用,如果提供外部1mhz时钟源作为clk_1us 时钟信号,就可以省去预分频器模块(如ds1wm数据资料中的τ注释,输入时钟指定在0.8mhz至1.0mhz之间)。
单总线输入输出模块为data总线和dq提供双向信号。在大多数应用中,dq信号是一个i/o引脚。如果是这种情况,dq引脚驱动器必须是一个漏极开路引脚,且具有合适的esd保护(参见图1)。另外,如果外围器件所使用的上拉电压高于1wm电源电压,则引脚驱动器还必须承受这样的超限电压,且不能使用钳位二极管。dallas建议采用输出阻抗100ω的驱动器(q1),以及一个4.7kω的外部dq上拉电阻至芯片vcc。为保证芯片能够正常工作,芯片vcc必须高于1-wire从器件的高电平门限vih。
图1:dq驱动(one_wire_io)
程序库
verilog源程序的编译无需外部库文件,而vhdl源程序则需要ieee.std_logic_1164和work.std_arith库文件。
连接
下表列出了1 - wire主机正常工作需要连接的引线。
如果系统没有地址选通信号,/ads可以接为低电平,使地址锁存器直通。/en信号应由地址译码逻辑产生,在外部连接至1-wire主机模块。如果1wm是数据总线上唯一的器件,则/en可以接为低电平。连到clk上的系统时钟频率必须在3.2mhz到128mhz之间。关于详细的连接操作,请参考 [2]ds1wm11-wire master datasheet。
例程
下面是如何采用verilog语言创建1-wire主机例程的一个实例。
module ds89c200 (...top level list...);
wire [7:0] db;
wire [2:0] addr;
wire sysclk, read-bar,
write-bar, master_reset,
interrupt, addr_strobe;
wire dq_out;
supply1 tie1;
supply0 tie0;
cpu xcpu(.clk(sysclk),
.db(db),
.extrd-bar(read-bar),
.extwr-bar(write-bar),
.extaddr(addr),
.reset(master_reset),
.extintr(interrupt),
.addr_st(addr_strobe),
... other i/o signals ...);
onewiremaster xonewiremaster(
.address(addr),
.ads-bar(addr_strobe),
.en-bar(tie0),
.rd-bar(read-bar),
.wr-bar(write-bar),
.data(db),
.intr(interrupt),
.clk(sysclk),
.dq(dq_out),