jjzjj

HDL语言与验证-I2C

A橙_ 2023-07-28 原文

 工程文件:

电子测试平台2

        这个实验的第一部分写个状态机还是很简单的,第二部分I2C只给了一份没什么注释的代码......。看懂后我写了一个老师给出的IIC代码的解释,但是md格式丢掉了,PDF在github上,可以参考一下。

HDL语言与验证实验

一、自定FSM说明

1、状态描述

       设计如下状态,表示单日活动轨迹:

S0:宿舍休息

S1:起床并吃早餐,吃完后有课则上课(b=1),无课自习,体温异常(T>37)则留在寝室休息

S2:12节上课,若34有课则继续去上课(c=1),否则自习

S3:12节自习,若34有课则去上课(c=1),否则自习

S4:34节上课,结束后去吃午餐

S5:34节自习,结束后去吃午餐

S6:吃午餐并午休,午休结束后56节上课

S7:56节上课,课后若有会则开会(d=1),无会晴天(e=1)跑步,雨天自习

S8:78节跑步,跑步后去吃晚餐

S9:78节开会

S10:78节自习

S11:晚餐,吃完后自习,若周五直接回寝室(F=1)

S12:晚自习,结束后若有快递(g=1)去取快递,否则直接回寝休息

S13:取快递,取完后回寝休息

输出pos为位置:

00:宿舍园区

01:教学楼

10:体育场

11:快递点

状态图如下:

2、设计代码说明

       状态机描述代码如下:

        输入端口为控制信号和时钟信号,输出端口为pos,表示位置:

       使用4位16进制数表示所有状态:

        下一状态判断:

        状态更新与输出:

test_bench代码如下:

第一次从s0开始,设定状态变化为:

s0-> s1->s2->s4->s6->s8/s10(由随机产生的e决定)->s11->s12->s13->s0

第二次从s0开始,设置T=37,状态在s0和s1之间转换

14个周期后设置Y=36,状态变化为:

s0-> s1->s3->s5->s6->s9->s11->s0

此后设置a=0,停留在s0状态

3、仿真波形说明 

      

      

       根据波形,可以验证状态转换与状态图一致,且pos输出正确。

二、EEPROM读写代码设计及仿真

1、代码说明

       输入:

              clk,rstn分别为时钟和复位信号

              write_op:写命令,低电平有效

              write_data:写数据

              addr:地址

              read_op:读命令,低电平有效

       输出:

              read_data:读到的数据

              op_done:操作结束

       I2C协议信号:

              scl:I2C协议的scl信号

              sda:I2C协议的sda信号

        使用8位16进制数表示所有状态,共55个:

       状态转移情况如下:

      scl周期是使用计数器对时钟周期计数实现的,一个scl周期是30个时钟周期,30*200k=6Mhz,为所使用的FPGA板的时钟频率。

        下一状态的更新:

        使用wr_op和rd_op将输入信号write_op,read_op表示的读写命令用高电平表示:

        下一状态判断,与状态图一致,时间为scl_tick,即scl周期结束。

        首先是在scl=1时,sda由1->0,开始数据传输,并先写入器件地址(10100000)和数据地址,然后根据wr_op,rd_op判断进行读还是写操作,写操作直接开始写入数据,读操作则需要重新写器件地址和数据地址,然后读取数据。

SCL同步的实现:

        空闲,等待,操作结束,start开始等状态下SCL都是高电平,因此不需要clr_scl对SCL清零。另外clr_scl只在scl_ls(scl的低电平开始)处才置1,把scl清0,在15个clk周期的scl_hs处,再把scl拉高,就实现了SCL周期。

SDA:

        SDA的控制信号声明,这些信号在对应的状态且scl在低电平的中心时置1,根据这些控制信号,在SDA上进行数据读写。而i2c_reg用来暂存数据。

        使用信号i2c_rlf表示是否有读写操作,如果有,则i2c_reg将左移,一位一位处理数据。

        根据上述控制信号,将输入的特定数据保存到i2c_reg

        sda输出使用sda使能信号sda_en控制,写器件地址,数据地址,写数据时使能信号为1,接收ACK响应时使能为0。sda输出i2c_reg的最高位,即一位一位完成读或写。

        读取数据时将数据读到read_data

        最后使用d5ms_count计数时钟周期等待,使用时钟频率为6Mhz,一个周期166ns,等待约1.36ms,然后重新开始完成新的读写命令。

2、TestBench代码说明

       模块声明与实例化:

        根据时钟频率6Mhz设置周期166ns,并对信号初始化:

        首先输入写命令信号,地址为8‘h55,写入的数据为8’haa。等待操作完成后,将write_op设为1(高电平无效),输入读命令信号,读出地址8’h55中的数据,读出的数据应该为刚刚写入的8’haa。

3、仿真波形说明(截图+文字标注)

       首先是向地址为8‘h55处写入数据,sda在scl为高电平时产生下降沿,表示开始工作,scl开始翻转,依次写入器件地址,数据地址,以及数据8’haa,并接收响应。最后scl为高电平,sda产生上升沿,停止工作。

        经过等待后开始读出0x55处的数据,先写入器件地址,数据地址(dummy write),然后再次写入器件地址,读出数据。

三、实验总结

       通过实验,学习了verilog语言的基本语法以及使用verilog语言描述时序逻辑和组合逻辑的方式。学习了如何使用verilog编写有限状态机并练习编写了简单的有限状态机。了解了test_bench的编写以及熟悉了使用ModelSim进行波形仿真。理解了I2C接口协议以及I2C协议下SCL,SDA数据是如何传输的。对于给出的参考代码能够基本理解,也能够对应波形仿真结果解释I2C协议的数据传输,最后将代码下载至FPGA开发板,验证了I2C协议正常工作。对于实验中I2C协议的verilog实现的一些具体细节理解的还不够深刻,使用verilog语言编写有限状态机的能力还比较基础,还需要后续的练习和进一步的学习。

有关HDL语言与验证-I2C的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐