安德鲁

[笔记].一种双向口的Verilog写法.[Verilog]

0
阅读(2957)

基本思路


图1 双向口的基本框图

如图1,当io_en为0时,三态门被打开,数据从i_dat输入到io_dat;当io_en为1时,三态门被关闭,数据从io_dat输出到 o_dat,i_dat与io_dat之间为高阻态,无法建立通路。即io_en=0,io_dat做输出口;io_en=1,io_dat做输入口。

 

源代码

01 module bidir (
02   input             i_clk, 
03   input             io_en,  // 0 input; 1 output
04   inout [1:0]       io_dat,
05   input [1:0]       i_dat,
06   output reg [1:0]  o_dat
07 );
08  
09 reg [1:0] i_dat_r;
10  
11 assign io_dat = (!io_en) ? i_dat_r : 2'bz;
12  
13 always@(posedge i_clk)
14 begin
15   if(!io_en)
16     i_dat_r <= i_dat;
17   else
18     o_dat   <= io_dat;
19 end
20  
21 endmodule

 

在ff中转换数据,故相应的输出都会延迟一个clock。


图2 QII综合的RTL

 

仿真波形

输出口仿真


图3 输出口波形

输入口仿真


图4 输出口波形

 

参考

1. 莫海永, 张申科.FPGA中双向端口I/O的研究.国外电子测量技术.2005年第6期