- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)