1,主要目的是为了实验PENCORES上的两个开源的IP,UART2BUS和I2C。
2,在FPGA STARTER 开发板上进行实验。
3,速度不做要求。
4,UART2BUS提供了一个WINOWS控制FPGA内部寄存器的方式。
5,所采用的两个IP都是已经经过OPENCORES的官方认证的。
6,下面的文字记录整个实现过程。
1,下载下来这个两核,并解压缩。
2,建立一个QUARTUS项目,起名为i2c_pro,把两个项目的代码加入到工程里面。
3,新建一个顶层文件i2c_pro.v 建立i2c_pro模块。
4,将两个模块连接,注意复位rst的电平。
module i2c_pro(
input clk ,
input rst ,
input rxd,
output txd ,
inout scl,
inout sda
);
wire [7:0]sys_dat2slave ;
wire [7:0]sys_dat2master ;
wire [15:0] sys_address;
uart2bus_top uart2bus_top
(
// global signals
.clock(clk),
.reset(rst),
// uart serial signals
.ser_in(rxd),
.ser_out(txd),
// internal bus to register file
.int_address(sys_address[15:0]),
.int_wr_data(sys_dat2slave),
.int_write(sys_wr),
.int_rd_data(sys_dat2master),
.int_read(sys_rd),
.int_req(sys_req),
.int_gnt(1'b1)
);
wire scl_pad_o,scl_padoen_o;
wire sda_pad_o,sda_padoen_o;
i2c_master_top i2c_master_top(
.wb_clk_i(clk),
.wb_rst_i(rst),
.arst_i(~rst),
.wb_adr_i(sys_address[2:0]),
.wb_dat_i(sys_dat2slave),
.wb_dat_o(sys_dat2master),
.wb_we_i(sys_wr),
.wb_stb_i(1'b1),
.wb_cyc_i(sys_req),
.wb_ack_o(),
.wb_inta_o(),
.scl_pad_i(scl),
.scl_pad_o(scl_pad_o),
.scl_padoen_o(scl_padoen_o),
.sda_pad_i(sda),
.sda_pad_o(sda_pad_o),
.sda_padoen_o(sda_padoen_o)
);
assign scl = (~scl_padoen_o) ? scl_pad_o:1'bz ;
assign sda = (~sda_padoen_o) ? sda_pad_o:1'bz ;
endmodule
5,设置好波特率 :
//The verilog definition can be copied from the following lines:
//global_clock_freq = 25000000
//baud_rate = 115200
`define D_BAUD_FREQ 'H480
`define D_BAUD_LIMIT 'H3889
6,综合之。发现只用了188个LE。这个规模完全可以综合在一个EPM240的CPLD里面。其中I2C核占用了41个LE,uart2bus部分占用了147LE。感觉I2C部分占用的LE有点过于少,存在问题,需要解决。
7,花了半个小时没有解决掉步骤6存在的问题。暂时先备份一放。改日再试验。
8,过了一个小时从新查看代码,发现UART2BUS的INT_GNT这个信号设置为1就可以正确编译出结果。此时UART2BUS占用了230LES,I2C的核占用了286个LE,这是个正常的消耗量。因此可以进行下一步实验了。
9,接下来就是锁定引脚。这里面就用了6个引脚,clk rst rxd txd scl sda。
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF
set_location_assignment PIN_10 -to clk
#set_location_assignment PIN_42 -to rst
set_location_assignment PIN_41 -to rst
#key0 actually
set_location_assignment PIN_4 -to rxd
set_location_assignment PIN_3 -to txd
set_location_assignment PIN_20 -to scl
set_location_assignment PIN_21 -to sda
10,运行以上脚本,之后编译项目通过。接下来的工作就是用串口终端打几个数据进行实验,看UART2BUS是否已经正确工作。
11,在进行串口实验过程中发现了,设置停止位为2的时候才能正确响应命令,也正好修改了一下之前开发板配备光盘的代码。很有收获。
12,上述工作完成,可以认为UART2BUS已经正确工作,I2C的核暂时没有方法得知是否已经正常工作。继续做软件方面的工作。保存好现在的版本以及资料之后就开始,上位机的编程。明天继续。
13,用API方式控制串口,成功。在网络上搜索到了OPNECORE_I2C的驱动,经过简单修改直接可以使用。
14,测试读写24C02成功,发现一个问题在突发写的时候可以连续写超过8个字节但是多次试验发现之能保证前8个是正确的。
15,后续做个简单的界面能对24CXX 系列的存储器进行读写。