基于fpga的i2c接口程序实现课程设计(编辑修改稿)内容摘要:
测试模块搭建 micro module: 微处理器部分可以采用 ZYE1502D 实验箱上有的 AT89C51 单片机,或者编写 Testbench 实现。 为了仿真方便,在仿真时采用 Testbench 搭建。 该micro 模型给出了微处理器与 IIC接口通讯的仿真程序。 该模型能产生相应的读写信号,地址信号,并行数据信号,并能接收从器件的应答信号,来调节发送或接收数据的速度。 在这个程序中,为了保证 IIC接口的正确性,可以进行完整的测试,写操作 时输入的地址信号和数据信号的数据由于较少,直接写入程序中。 读操作时,将读数对比可以验证程序的正确性。 该程序通过调用四个任务实现上述功能, write,monitor_iic_rdy, read_data, kill_time。 iic_slave module: 该 iic_slave 模型提供了一个 IIC 存储器。 该从模型能够侦测起始和终止命令,在地址控制字时序后产生 ACK,在数据读之后置 IIC总线三态。 另外它通过比较“ Slave Data Receive on Write”和“ Slave Data Transmitted on Read”的信息,实现仿真时数据正确性的检查。 clk_rst module:clk_rst 模块给测试平台提供时钟和复位信号。 编辑clk_period参数更改时钟频率,改变 reset_time参数就能改变复位信号的有效时间。 iic_tb, iic_tb 是测试台的顶层文件。 它将 IIC 接口模型 iic 和测试程序的模型 clk_rst、 micro、 iic_slave 实例化,并连接起来。 其主要程序: i2c I2C(.data(data),.addr(addr),.rst_l(rst_l),.clock(clock),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l),.scl_pin(scl_pin),.sda_pin(sda_pin))。 clk_rst CLK(.clk(clock),.rst_l(rst_l))。 micro MICRO(.clk(clock),.rst_l(rst_l),.data(data),.addr(addr),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l))。 i2c_slave SEP(.sda(sda_pin),.scl(scl_pin))。 时序仿真 做功能仿真时,在 Modelsim 中建立工程,把 IIC 的所有 verilog hdl 文件,以及 Testbench 用到的 verilog 文件加入到工程中,然后编译仿真。 仿真波形如图 , 所示。 图 iic_rst 仿真图 图 功能仿真波形 由输出结果可只,微处理器发送写地址 10100000,响应后写入数据 55H,响应后重新发启动信号,发送读地址 10100001,响应后读出数据,进行 比较。 同样操作,写入数据 AAH 并读出比较,结果两次数据读回均正确无误。 结束语 本课题设计了基于 FPGA 的 IIC 接口的数个模块,时钟模块、接收模块、发送模块、时序控制模块和输出缓冲模块,其中时序控制模块是设计的重点和难点。 每个模块都通过了功能仿真和时序仿真,仿真结果表明,各个模块均完成了相应的逻辑功能。 整个设计都采用了同步方式,而且没有使用特定公司的技术和 IP 核,这使得设计可以广泛地重用,但也存在着可改进之处: 需要提高 Verilog HDL 语言代码的效率,要力求用最简洁,可综合的描述方 式描述模块的 结构和功能,以使得芯片面积、功耗减小。 在基于 FPGA 的器件上,进行逻辑综合过程中,许多约束条件是相互矛盾的,这需要反复设定条件,以求电路结构得到优化。 基于 Verilog HDL 语言的可移植性,及不依赖器件的特性,设计者能在更抽象的层次上把握和描述系统结构和功能特性,使设计更具灵活性。 由于 FPGA 器件的快速发展,其容量可以将各种外围器件的接口集成到 FPGA 内部,这样可以实现设计的小型化,低功耗,并且降低了设计的复杂度,而且利用 FPGA 在线可编程特点,可以增加系统设计的灵活度,提高了设计效率。 在课题期间,通过不断地学习、探索和实践,掌握了 Verilog HDL 设计技术及其FPGA 的应用,提高了实际的工作能力和创新能力。 最后感谢我的老师和同学们,在他们的监督和帮助下让我顺利完成了本次的课程设计。 参考文献 [1]苏建志 ,王冰锋 .IIC总线及其应用 .现代电子技术 ,2020,22. [2]赵辉 .IIC总线技术及其应用实例 .微型电脑应用 ,2020,31(4):61. [3]周立功 .IIC总线概要 .产品应用手册 ,2020,3. [4]石宗义 .总线的时序分析及其模拟 [J].太原理工大学学报 ,2020,35(1):53. [5]朱明程 ,黄强 .FPGA 动态可重构逻辑设计初探 .半导体技术 ,2020,25(4):19. [6]褚振勇 .FPGA 设计及应用 [M].西安 :西安电子科技大学出版社 ,2020. [7]王毓银 .数字电路逻辑设计 [M].北京 :高等教育出版社 ,1999. [8]李洪伟 .基于 QuartusII 的 FPGA/CPLD 设计 [M].北京 :电子工业出版社 ,2020. 附录 1 时钟分频器程序 c l kr e s e ts c l _ c n t _ e n11111010 DE N AQP R EC L Rc l o c krs t _ ls c l _ c n t _ e ns c l _ t i c ks c l _ t i c k ~ re g 0c n t r module iic_clk(clock,rst_l,scl_t_en,scl_tick)。 //端口列表 input clock。 //外部系统处理器时钟 input rst_l。 //外部复位信号 ,低有效 input scl_t_en。 //来自时序控制器的计数使能信号 output scl_tick。 //状态机的工作时钟 //registersamp。 wires reg scl_tick。 reg [7:0] tr。 //分频计数值 //分频 always@(posedge clock or negedge rst_l) if(!rst_l) tr= 1 839。 b0。 else if(scl_t_en) tr= 1 839。 b0。 else tr=839。 b0。 always@(posedge clock or negedge rst_l) if(!rst_l) scl_tick= 1 139。 b0。 else if(tr= =839。 hFA) cl_tick= 1 139。 b1。 else scl_tick= 1 139。 b0。 endmodule 附录 2 数据接收模块程序 DE N AQP R EC L R=A [ 1 . . 0 ]B [ 1 . . 0 ]E Q U A L010011DE N AQP R EC L RD QP R EE N AC L Ra c k _ l ~ re g 0a l w a y s 0 ~ 1Eq u a l 02 39。 h 0 i i c _ g o ~ 0 i i c _ g o ~ 1i i c _ g o ~ re g 0w rd _ a d d [ 7 . . 0 ] ~ re g 0rs t _ lc l o c ks c l _ c n t _ e nc s _ li i c _ g oa c k _ ld a t a [ 7 . . 0 ]a d d r[ 1 . . 0 ]w rd _ a d d [ 7 . . 0 ]rd _ w r_ l `timescale 1 ns/100 ps module iic_wreg(data, addr, rst_l, clock, scl_t_en, rd_wr_l, cs_l, wrd_add,iic_go, ack_l)。 //端口列表 input [7:0] data。 //处理器输出的数据码 input [1:0] addr。 //处理器输出的地址码 input rst_l。 //复位信号 input clock。 //系统时钟 input cs_l, scl_t_en。 //系统使能信号 input rd_wr_l。 //命令信号 output [7:0] wrd_add。 //字地址 output iic_go。 //iic 总线启动信号 output ack_l。 //反馈给处理器的响应信号 //寄存器型 reg [7:0] wrd_add。 reg iic_go。 reg ack_l。 //寄存器参数 parameter w_add=239。 b00。 //地址寄存器 parameter d_add=239。 b01。 //数据寄存器 parameter s_add=239。 b10。 //状态寄存器 always@(posedge clock or negedge rst_l) if(!rst_l) wrd_add = 1 839。 b0。 else if(cs_lamp。 amp。 !rd_wr_lamp。 amp。 (addr= =w_add)) wrd_add = 1 data。 always@(posedge clock or negedge rst_l) if(!rst_l) iic_go= 1 139。 b0。 else if(cs_lamp。 amp。 !rd_wr_lamp。 amp。 (addr= =w_add)) iic_go= 1 139。 b1。 //iic 总线的启动信号 else if(scl_t_en) iic_go= 1 139。 b0。 //反馈响应信号 always@(posedge clock or negedge rst_l) if(!rst_l) ack_l= 1 139。 b1。 else if(cs_l) ack_l= 1 139。 b0。 else ack_l= 1 139。 b1。 endmodule 附录 3 发送寄存器程序 `timescale 1 ns/100 ps module iic_rreg(wrd_add,iic_rdata,iic_rdy,iic_act,ack_err,addr,data_o)。 input [7:0] wrd_add。 //iic word address input [7:0] iic_rdata。 //iic read data input iic_rdy。 //iic status bit input iic_act。 //iic cycle active input ack_err。 //ack error input [1:0] addr。 //cpu address output [7:0] data_o。 //muxed cpu data output //寄存器型 reg[7:0] data_o。 //muxed cpu data output //参数 Parameter w_add=239。 b00。 //字地址寄存器 parameter d_add=239。 b01。 //数据寄存器 parameter s_add=239。 b10。 //状态寄存器 //数据多用输出 always@(addr or wrd_add or ack_err or iic_rdata or iic_rdy) case(addr) w_add::data_o= 1 wrd_add。 d_add::data_o= 1 iic_rdata。 s_add:data_o= 1{iic_rdy,ack_err,539。 b0,iic_act}。 default:data_o= 1{iic_rdy,ack_err,539。 b0,iic_act}。 endcase endmodule。基于fpga的i2c接口程序实现课程设计(编辑修改稿)
相关推荐
加,电感储能;而当开关管关断时,电感电流减小,电感释能。 假定电流增加量大于电流减小量,则一个开关周期内电感上磁链增量为:。 此增量将产生一个平均感应电势:。 1 此电势将减小电感 电流的上升速度并同时降低电感电流的下降速度,最终将导致一个周期内电感电流平均增量为零;一个开关周期内电感上磁链增量小于零的状况也一样。 这种在稳态状况下一个周期内电感电流平均增量(磁链平均增量)为零的现象称为
、汉字,还可以自定义显示内容,而且 单片机 小 磁铁 霍尔传感器 XXX。 基于单片机的出租车计价器设计 12 占用的 I/O 口少,有效节约了系统的资源,使整个系统更加简洁,并且成本低廉。 LCD1602液晶显示器可以显示 16*2个字符,它的正常工作电压在 之间,额定工作电流为 , 字符尺寸为 *(W*H)mm。 LCD1602 的各个引脚功能如表 所示。 表 LCD1602引脚说明 编号
3 根控制线,这样给使用带来很大的方便,节约单片机 I/O口。 但是市场上一块 LCD1602 的价格要 15元左右,比数码管贵很多。 方案三:功能强大、可以显示中文文字的 LCD12864 液晶显示器,其价格贵,体积大,控制比数码管稍微复杂点,但是使用也是很方便的。 在控制使用上,需要 8根数据线和 3根控制线,其余的 PSB、 RST 和 BLA直接与 VCC相连接。
制的相互转化。 系统设计的方案论证 单片机 的应用领域无所不至,无论是民用部门、工业部门、事业部门和家用领域等都有它的身影 ,是因为它有如下特点 : 单片机高性能低价格,它尽可能的把应用所需要的存储器、各种功能的 I/O 端口都集中在一块芯片上内。 单片机是将 CPU、数据存储器、程序存储器、各种功能的 I/O端口集成于一块芯片上 ,内部结构简单、体积小、稳定性较高。
窃电功能。 FLTON=0 时选择关闭自动防窃电功能,用户可以根据当前有效电流通道状态CHNSEL()进行通道选择; FLTON=1 时开启自动防窃电功能,防窃电单元根据窃电阈值的 设置,自动选择相应的通道进行计量 [8]。 时钟管理 系统时钟管理模块包含系统时钟生成和系统时钟控制两部分。 系统时钟 fsys 有两种生成形式:一是低频晶振输出 fosc 频率为 32KHz,二是 PLL 输出高频
过读入输入线的状态就可得知是否有键按下了。 具体的识别及编程方法如下所述。 矩阵式键盘的按键识别方法 确定矩阵式键盘上何键被按下介绍一种 “行扫描法 ”。 行扫描法行扫描法又称为逐行 (或列 )扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。 判断键盘中有无键按下将全部行线 Y0Y3 置低电平,然后检测列线的状态。 只要有一列的电平为低,则表示键盘中有键被按下