用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 系列的存储器进行读写。
- 用FPGA开发板做一个I2CEEPROM的烧写器
- 用FPGA做一个生日礼物
- FPGA开发板的作用
- 做开发的一个反思
- FPGA开发之FPGA的资源
- Xilinx FPGA 开发板
- Basys2 FPGA 开发板
- 将自己做的FPGA工程封装成一个IP核
- FPGA做过IIC的请进
- 做一个软件开发的高手
- 在做一个语音系统的开发
- FPGA开发的基本流程
- FPGA - DE0开发板 nCEO Pin 分配错误的解决办法
- 我眼中的ZX-2 FPGA开发板
- FPGA - DE0开发板 nCEO Pin 分配错误的解决办法
- 【奔跑的FPGA】part three DE1开发板初探
- Kintex7 FPGA开发板设计
- [FPGA开发]关于FPGA学习的几个问题 (转载)
- 最近……
- delphi中时间比较、日期相减、日期比较
- 多一点技术论坛,多一些技术帮助
- hdu1686
- Android系统移植与调试之------->Android Sensor传感器系统架构初探
- 用FPGA开发板做一个I2CEEPROM的烧写器
- 黑莓新机发售遇冷 欲借“新概念”产品上位
- 在编写图形界面软件的时候,经常会遇到处理两个矩形的关系。
- (转载)函数指针及函数指针数组的妙用
- Windows 动态链接库 DLL 浅析
- ndk 8d compiled ffmpeg libstagefright
- 加密算法说明(Base64、MD5)
- 有线电视网络
- 哪本书是对程序员最有影响、每个程序员都该阅读的书?