Verilog双向IO口实现 (.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最近有一个项目要用到FPGA,还要用硬件描述语言综合出一个双向IO口用作地址数据总线。 一直没能够实现,在实验过程中遇到了或这或那的问题,终于在今天有所突破!能够正确的读写CAN控制芯片SJA1000的测试寄存器。 在试验中也总结了一些东西,如下: 1、Inout口,一般要放在最顶层的V文件中,我试验过放到下面的v文件中,没能够成功(更正一下:inout并非一定要在最顶层,也可以在底层设置。具体可参见黑金开发板建模篇 实验13 DS1302实时时钟驱动。)。 2、在一个module中,可以将输出定义为reg型,然后直接与要驱动module的wire型输入相连,没有问题。 3、在调试程序的过程中,尽量借助于工具,如quartus内部的Signal Tap。之前一直不会使用,现在也在慢慢学习。 用来模拟的是intel模式的总线读写 其时序图如下: 代码包括下面的及部分: can_top.v module can_top ( CLK, RSTn, Row_scan, Column_scan, can_pin, can_ALE, can_WR, can_RD, can_CS, can_dir, can_rst_out ); input CLK; input RSTn; output [7:0] Row_scan; output [1:0] Column_scan; inout [7:0] can_pin; output can_ALE; output can_WR; output can_RD; output can_CS; output can_dir; output can_rst_out; wire [7:0] data_in; wire rmd; wire wmd; wire [7:0] adr; wire [7:0] data_tx; wire [7:0] data_rx; wire rd_flag; wire wr_flag; trans_control U3 ( .CLK(CLK), .RSTn(RSTn), .data_in(data_in), .Row_scan(Row_scan), .Column_scan(Column_scan) ); wire can_rst; can_ctr U1 ( .CLK(CLK), .RSTn(RSTn), .rd_flag(rd_flag), .wr_flag(wr_flag), .data_rx(data_rx), .data_display(data_in), .rmd(rmd), .wmd(wmd), .adr(adr), .data_tx(data_tx), .can_rst(can_rst) ); can_op U2 ( .CLK(CLK), .RSTn(RSTn), .can_rst_in(can_rst), .rmd(rmd), .wmd(wmd), .adr(adr), .data_tx(data_tx), .can_in(can_in_temp), .en_out(en_out), .can_out(can_out), .read_cmd(read_cmd), .data_rx(data_rx), .can_ALE(can_ALE), .can_WR(can_WR), .can_RD(can_RD), .can_CS(can_CS), .can_dir(can_dir), .rd_flag(rd_flag), .wr_flag(wr_flag), .can_rst_out(can_rst_out) ); wire en_out; wire [7:0] can_out; // wire [7:0] can_in; reg [7:0] can_in_temp; wire read_cmd; always @ ( posedge CLK or negedge RSTn ) begin if(!RSTn) can_in_temp=8b1000_1001; else begin if(read_cmd==1b1) can_in_temp = can_pin; end end // assign can_in = can_in_temp; assign can_pin = (en_out==1b1)?can_out:8bZZZZZZZZ; //双向口设置 endmodule can_ctr.v module can_ctr ( CLK, RSTn, rd_flag, wr_flag, dat

文档评论(0)

xiaofei2001129 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档