用FPGA开发板做一个I2CEEPROM的烧写器

来源:互联网 发布:java path finder 编辑:程序博客网 时间:2024/05/21 03:24

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 系列的存储器进行读写。

 

 

 

 


 

 

 

 

原创粉丝点击