前几天一直在调自己写的AXI总线IIC IP核,本想着很简单的东西,硬是搞了好几天。主要是不太熟悉vivado的开发,具体就是三态的问题!!三态要放在最顶层的.v文件中,我的就是封装在IP里面,然后调试好久,打开综合后的文件才发现一直就是个OBUF,根本不是三态。建立了个新工程后调用了原装的AXI IIC后发现就是在最顶层中把信号接入IOBUF中,虽然不知道这样是什么原理,但想他这样写肯定有他的道理,不然没必要搞得这么复杂,还要在顶层中例化一个IOBUF。。。按他的样子,在IP中信号都是input 和ouput,只有在管脚时才inout。
`timescale 1 ps / 1 ps
module top(
input sys_clk_clk_n,
input sys_clk_clk_p,
// hdmi
output HDMI_R_CLK,
output HDMI_R_HSYNC,
output HDMI_R_VSYNC,
output HDMI_R_DE,
output HDMI_R_D0,
output HDMI_R_D1,
output HDMI_R_D2,
output HDMI_R_D3,
output HDMI_R_D4,
output HDMI_R_D5,
output HDMI_R_D6,
output HDMI_R_D7,
output HDMI_R_D8,
output HDMI_R_D9,
output HDMI_R_D10,
output HDMI_R_D11,
output HDMI_R_D12,
output HDMI_R_D13,
output HDMI_R_D14,
output HDMI_R_D15,
// 7511
inout iic_sda,
output iic_scl,
// 7611
inout iic_sda_1,
output iic_scl_1,
// uart
input rs232_uart_rxd,
output rs232_uart_txd
);
// 调用block
wire [7:0] hdmi_u;
wire [7:0] hdmi_v;
wire [7:0] hdmi_y;
wire clk_test;
assign {HDMI_R_D7,HDMI_R_D6,HDMI_R_D5,HDMI_R_D4,
HDMI_R_D3,HDMI_R_D2,HDMI_R_D1,HDMI_R_D0} = hdmi_y;
assign {HDMI_R_D15,HDMI_R_D14,HDMI_R_D13,HDMI_R_D12,
HDMI_R_D11,HDMI_R_D10,HDMI_R_D9,HDMI_R_D8} = hdmi_u;
// 7511 IIC
IOBUF IOBUF_inst0(
.O(iic_sda_in), // Buffer output
.IO(iic_sda), // Buffer inout port (connect directly to top-level port)
.I(sda_r), // Buffer input
.T(~sda_dir) // 3-state enable input, high=input, low=output
);
// 7611 IIC
IOBUF IOBUF_inst1(
.O(iic_sda_in_1), // Buffer output
.IO(iic_sda_1), // Buffer inout port (connect directly to top-level port)
.I(sda_r_1), // Buffer input
.T(~sda_dir_1) // 3-state enable input, high=input, low=output
);
// 例化block
system_wrapper system_wrapper_inst0
(
.clk_test ( clk_test ),
.hdmi_clk ( HDMI_R_CLK ),
.hdmi_de ( HDMI_R_DE ),
.hdmi_hsy ( HDMI_R_HSYNC ),
.hdmi_u ( hdmi_u ),
.hdmi_v ( hdmi_v ),
.hdmi_vsy ( HDMI_R_VSYNC ),
.hdmi_y ( hdmi_y ),
.iic_scl ( iic_scl ),
.iic_scl_1 ( iic_scl_1 ),
.iic_sda_in ( iic_sda_in ),
.iic_sda_in_1 ( iic_sda_in_1 ),
.reset ( 1'b0 ),
.rs232_uart_rxd ( rs232_uart_rxd),
.rs232_uart_txd ( rs232_uart_txd),
.sda_dir ( sda_dir ),
.sda_dir_1 ( sda_dir_1 ),
.sda_r ( sda_r ),
.sda_r_1 ( sda_r_1 ),
.sys_clk_clk_n ( sys_clk_clk_n ),
.sys_clk_clk_p ( sys_clk_clk_p )
);
endmodule
顶层文件变成这样的了。。
另外在microblzae中还碰到一个stack overflowed的问题,这个要修改localmemory,默认是8KB,我把它修改成128KB,错误就没有了。注意配置这个128KB不是双击它配置的,而是在例化它后点击run block Automation出来的单独一页的配置界面中下拉选择(就一页配置界面)