【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现

基于FPGA的IIC协议详解——EEPROM控制器(1) IIC协议举例常用IIC协议使用地方常见IIC协议的注意点24LC64芯片读写命令的时序图eeprom控制器的系统框图时序图设计代码设计EEPROM控制器测试模块的代码结束语 常用IIC协议使用地方 熟悉一个协议一定要知道这个协议应该用到什么地方,IIC协议作为飞利浦公司定义的一个慢速传输协议,常用于: 1、芯片寄存器的配置; 2、eeprom的读写; 本次实验我们将使用eeprom来讲解IIC协... 阅读详情
AI摘要

本文聚焦于FPGA实现IIC协议读写EEPROM中EEPROM读写控制模块的实现。先进行模块功能分析,明确其需根据信号与I2C接口模块交互;接着介绍输入/输出信号,阐述状态机各状态;给出模块的Verilog代码,并进行了写数据和读数据的仿真测试。

写在前面:
FPGA实现IIC协议读写EEPROM相关文章:

IIC通信协议
【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现
【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现
【FPGA】FPGA实现IIC协议读写EEPROM(三) ----- 汇总篇

在上篇文章中已经对IIC协议和IIC接口驱动实现进行了详细介绍,本文介绍EEPROM读写控制模块的实现。

一、模块功能分析

EEPROM读写控制模块需要根据接收到的按键读写请求信号以及I2C接口模块返回的信号发送读写请求、控制指令、数据字节给I2C接口模块,以及接收I2C接口模块返回的数据。

二、输入/输出信号

EEPROM读写控制模块输入/输出信号如下:
在这里插入图片描述

信号说明:

信号I/O类型说明
rdin[7:0]inputI2C接口模块读回的数据
rdin_vldinputI2C接口模块读回的数据有效标志
rw_doneinputI2C接口读写一字节数据完成标志
rd_reqinput读请求
wr_reqinput写请求
reqoutput输出给I2C接口模块的读写请求
cmd[3:0]output控制命令
wr_dout[7:0]output要发送的数据/控制字节

三、EEPROM读写控制模块状态机

EEPROM读写控制模块状态转移图如下:
在这里插入图片描述

状态说明:
IDLE:空闲状态,等待读写请求。
SEND_WRREQ:发送写请求、控制指令、写控制字、地址、数据字节给I2C接口模块。
SEND_RDREQ :发送读请求、控制指令、写控制字、地址、读控制字给I2C接口模块。
WAIT_WRDONE:等待I2C接口模块写数据完成。
WAIT_RDDONE:等待I2C接口模块读数据完成。
WR_DONE:I2C接口模块写数据完成。
RD_DONE:I2C接口模块读数据完成。

四、EEPROM读写控制模块实现

EEPROM读写控制模块verilog代码如下:

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.13                        
//  Design Name: i2c_eeprom    
//  Module Name: eeprom_ctrl         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: 使用I2C协议读写EEPROM驱动控制模块
//  **************************************************************
module eeprom_ctrl (
    input               clk                 ,
    input               rst_n               ,
    //  key_filter
    input               wr_req              ,       //  读请求
    input               rd_req              ,       //  写请求
    //  i2c_interface
    input   [7:0]       rdin                ,       //  从I2C接口读回的数据
    input               rdin_vld            ,
    input               rw_done             ,       //  读写一字节数据完成标志
    output              req                 ,       //  读写请求
    output  [7:0]       wr_dout             ,       //  要发送的数据
    output  [3:0]       cmd                   
);

    //  参数定义
    //  状态机参数定义
    localparam  IDLE        =   7'b000_0001 ,
                SEND_WRREQ  =   7'b000_0010 ,   //  发送写请求
                SEND_RDREQ  =   7'b000_0100 ,   //  发送读请求
                WAIT_WRDONE =   7'b000_1000 ,   //  等待写数据完成
                WAIT_RDDONE =   7'b001_0000 ,   //  等待读数据完成
                WR_DONE     =   7'b010_0000 ,   //  写数据完成
                RD_DONE     =   7'b100_0000 ;   //  读数据完成

    //  信号定义
    reg     [6:0]       state_c                 ;
    reg     [6:0]       state_n                 ;
    
    reg     [3:0]       byte_num                ;   //  字节数
    reg     [3:0]       cnt_byte                ;   //  字节计数器
    wire                add_cnt_byte            ;
    wire                end_cnt_byte            ;

    reg     [7:0]       wrdata                  ;   //  寄存将要发送的数据
    reg     [3:0]       command                 ;   //  寄存将要发送的命令
    reg                 rw_req                  ;


    //  状态转移条件
    wire                idle2sendwrreq          ;
    wire                idle2sendrdreq          ;
    wire                sendwrreq2waitwrdone    ;
    wire                sendrdreq2waitrddone    ;
    wire                waitwrdone2wrdone       ;
    wire                waitwrdone2sendwrreq    ;
    wire                waitrddone2rddone       ;
    wire                waitrddone2sendrdreq    ;
    wire                wrdone2idle             ;
    wire                rddone2idle             ;

    //  状态机
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            state_c <= IDLE ;
        end
        else begin
            state_c <= state_n ;
        end
    end

    always @(*)begin
        case (state_c)
            IDLE: begin
                if(idle2sendwrreq)
                    state_n = SEND_WRREQ ;
                else if(idle2sendrdreq)
                    state_n = SEND_RDREQ ;
                else
                    state_n = state_c ;
            end
            SEND_WRREQ: begin
                if(sendwrreq2waitwrdone)
                    state_n = WAIT_WRDONE ;
                else
                    state_n = state_c ;
            end
            SEND_RDREQ: begin
                if(sendrdreq2waitrddone)
                    state_n = WAIT_RDDONE ;
                else
                    state_n = state_c ;
            end
            WAIT_WRDONE: begin
                if(waitwrdone2wrdone)
                    state_n = WR_DONE ;
                else if(waitwrdone2sendwrreq)
                    state_n = SEND_WRREQ ;
                else
                    state_n = state_c ;
            end
            WAIT_RDDONE: begin
                if(waitrddone2rddone)
                    state_n = RD_DONE ;
                else if(waitrddone2sendrdreq)
                    state_n = SEND_RDREQ ;
                else
                    state_n = state_c ;
            end
            WR_DONE: begin
                if(wrdone2idle)
                    state_n = IDLE ;
                else
                    state_n = state_c ;
            end
            RD_DONE: begin
                if(rddone2idle)
                    state_n = IDLE ;
                else
                    state_n = state_c ;
            end
            default: state_n = IDLE ;
        endcase
    end
    //  状态转移
    assign idle2sendwrreq      = state_c == IDLE        && wr_req       ;
    assign idle2sendrdreq      = state_c == IDLE        && rd_req       ;  
    assign sendwrreq2waitwrdone= state_c == SEND_WRREQ  && (1'b1)       ;
    assign sendrdreq2waitrddone= state_c == SEND_RDREQ  && (1'b1)       ;
    assign waitwrdone2wrdone   = state_c == WAIT_WRDONE && end_cnt_byte ;
    assign waitwrdone2sendwrreq= state_c == WAIT_WRDONE && (cnt_byte < 2) && rw_done    ;
    assign waitrddone2rddone   = state_c == WAIT_RDDONE && end_cnt_byte ;
    assign waitrddone2sendrdreq= state_c == WAIT_RDDONE && (cnt_byte < 3) && rw_done    ;
    assign wrdone2idle         = state_c == WR_DONE     && (1'b1)       ;
    assign rddone2idle         = state_c == RD_DONE     && (1'b1)       ;

    //  byte_num
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            byte_num <= 0 ;
        end
        else if(wr_req)begin
            byte_num <= 3 ;
        end
        else if(rd_req)begin
            byte_num <= 4 ;
        end
        else if(wrdone2idle | rddone2idle)begin
            byte_num <= 0 ;
        end
    end

    //  cnt_byte
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_byte <= 0 ;
        end
        else if(add_cnt_byte)begin
            if(end_cnt_byte)begin
                cnt_byte <= 0 ;
            end				
            else begin	    
                cnt_byte <= cnt_byte + 1 ;
            end 		    
        end
    end                   
    assign	add_cnt_byte = rw_done ;
    assign	end_cnt_byte = add_cnt_byte && (cnt_byte == byte_num - 1) ;

    //  rw_req
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            rw_req <= 1'b0 ;
        end
        else if(idle2sendwrreq | idle2sendrdreq | sendwrreq2waitwrdone | sendrdreq2waitrddone)begin
            rw_req <= 1'b1 ;
        end
        else begin
            rw_req <= 1'b0 ;
        end
    end

    //  wrdata   command
    always @(*)begin
        if(state_c == SEND_WRREQ)begin
            case (cnt_byte)
                0: begin wrdata = 8'b1010_0000 ;command = 4'b1010 ; end    //  写控制字
                1: begin wrdata = 8'b1101_1001 ;command = 4'b1000 ; end    //  写地址
                2: begin wrdata = 8'b1111_1001 ;command = 4'b1001 ; end    //  写数据
                default: begin wrdata = 8'b0 ;command = 4'b0 ;end
            endcase
        end
        else if(state_c == SEND_RDREQ)begin
            case (cnt_byte)
                0: begin wrdata = 8'b1010_0000 ;command = 4'b1010 ; end    //  写控制字
                1: begin wrdata = 8'b1101_1001 ;command = 4'b1000 ; end    //  读地址
                2: begin wrdata = 8'b1010_0001 ;command = 4'b1010 ; end    //  写读控制字
                3: begin wrdata = 8'b0 ;command = 4'b0101 ;      end    //  读数据
                default: begin wrdata = 8'b0 ;command = 4'b0 ;end     
            endcase
        end
    end

    //  输出
    assign  req = rw_req ;
    assign  cmd = command ;
    assign  wr_dout = wrdata ;

endmodule                               

五、仿真测试

写数据:
在这里插入图片描述
读数据
在这里插入图片描述

FPGA和eeprom通信 阅读详情

相关推荐

【接口协议】FPGA实现IIC协议对EEPROM进行数据存储与读取(AT24C64)

使用vivado实现IIC协议对EEPROM进行数据存储与读取。本文是基于正点原子的“达芬奇”开发板资料进行学习的笔记,对部分地方进行了修改,并进行了详细的讲解。

weixin_47730622的博客 3200

FPGA——基于IIC协议的EEPROM功能实现

关于EEPROM学习的小结。其中相关代码来自正点原子、相关资料来自米联客。

zhu1289的博客 3569

FPGA实现IIC接口(2)--IIC接口芯片的实际使用

通过本文您会学到:如何用EEPROM来实现IIC接口。

孤独的单刀 4万+

【FPGA】FPGA实现IIC协议读写EEPROM(三) ----- 汇总篇

FPGA实现IIC协议读写EEPROM工程汇总介绍

白码王子小张的博客 3559

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

【电力电子控制】基于强化学习的单相逆变器并网电流控制

本文将尝试以 DQN(Deep Q-Network)为例,设计并训练一个面向单相逆变器的智能控制器,实现对并网电流的精准调节。

weixin_62596197的博客 463

基于FPGA的IIC读写EEPROM

主机进行数据读写时,I2C协议规定,数据传输时先发送寻址字节,即7位从机地址+0/1。写控制字节,从机接收到应答信号 -> 写数据地址,从机接收到应答信号,如果数据地址是2位的话,就继续写数据地址,从机接收到应答信号 -> 写数据,从机接收到应答信号 -> 继续写数据,直到写完全部的数据 -> 最后发停止位。控制字节,从机接收到发应答信号 -> 写数据地址,从机接收到发应答信号,如果数据地址是2位的话,就继续写数据地址,从机接收到发应答信号 -> 写数据,从机接收到发应答信号 -> 最后发停止位。

weilit_的博客 2146

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 320

IIC读写EEPROM

基于C4的FPGA开发板实现IIC读写EEPROM操作

qq_46689721的博客 5398

了解你的GPU:深入探讨AMD SMI

2024年9月17日 作者:Matt Elliott对于使用AMD硬件的系统管理员和高级用户来说,性能优化和高效的资源监控至关重要。AMD系统管理界面命令行工具`amd-smi`正是为了解决这些需求而设计的。amd-smi是一个多功能的命令行工具,专门用于管理和监控AMD硬件,主要侧重于GPU。作为未来取代`rocm-smi`的工具,`amd-smi`有望成为跨广泛设备的AMD硬件管理的主要工具。

数字人生 4524

跨越移植陷阱:ESP-IDF下LVGL与ILI9341的组件化集成与常见避坑指南

本文详细解析了在ESP-IDF环境下将LVGL图形库与ILI9341显示屏驱动进行组件化集成的完整流程。重点介绍了移植过程中的关键配置策略、内存管理优化技巧以及常见问题解决方案,帮助开发者有效规避内存溢出、显示异常等典型陷阱,实现高效稳定的嵌入式GUI开发。

yhn456789的博客 625

FPGA学习笔记——简单的IIC读写EEPROM

本文设计了一个基于FPGA的IIC通信系统,实现PC端通过串口向EEPROM写入数据,并通过按键触发随机读取功能。系统包含串口收发、按键消抖、EEPROM读写控制等模块,采用200kHz的IIC时钟频率。写入时地址自动递增,读取时从地址0开始顺序读取并通过串口返回"读数据:xx"格式。详细阐述了状态机设计思路,包括IDLE、WRITE、READ等状态转换逻辑,并提供完整的Verilog代码实现。测试结果表明系统能正确完成数据写入和读取功能,为FPGA与EEPROM的IIC通信提供了可参考

ZHP的博客 1358

Jetson 平台编译安装 FFmpeg 7.1(支持 Nvmpi + SRT + x265)

摘要: 本文详细介绍了在NVIDIA Jetson平台上编译FFmpeg 7.1并集成关键功能的全过程。通过补丁方式加入Nvmpi实现硬件加速支持,同时编译集成x265编码器和SRT低延迟传输协议。步骤涵盖:1)安装x265编码器;2)配置SRT协议支持;3)编译jetson-ffmpeg的Nvmpi接口;4)定制化编译FFmpeg 7.1;5)验证模块集成情况。最终实现支持硬件编解码、高效HEVC压缩和可靠推流的增强版FFmpeg,为Jetson平台的音视频处理提供完整解决方案。

J。 345

【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现

FPGA实现IIC协议读写EEPROM的I2C接口驱动实现方法

白码王子小张的博客 4325

AUTOSAR NvM 实车故障深度剖析:车载存储问题快速定位与工程解决方案

软件配置与代码逻辑无问题时,排查底层驱动与ECU硬件,步骤如下:底层驱动排查:排查Fls/Eep驱动配置,是否适配目标MCU(如TC397、S32K),编程/擦除/读取时序是否合理;检查Fls/Eep驱动错误处理逻辑,是否未处理Flash编程失败、读取错误等异常;验证Flash高速编程模式是否启用,是否能提升写入/读取速度;排查MemIf层配置,是否正确对接NvM与Fls/Eep驱动,是否存在调度延迟。

getusushu的博客 78

第一章 电力电子仿真软件 PLECS简介

PLECS是瑞士Plexim公司开发的电力电子仿真软件,具有快速仿真、丰富元件库和热分析功能。软件提供单机版和嵌入MATLAB的版本,支持多平台安装且流程简单。首次运行需获取授权文件,提供60分钟演示模式。界面包含模型创建、帮助文档和元件库浏览器等功能区域,操作便捷。该软件是专业高效的电力电子系统仿真工具。

502

【FPGA】I2C读写EEPROM

I2C即Inter-Integrated Circuit(集成电路总线),是由Philips半导体公司(现在的NXP半导体公司)在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据。在主控与被控IC之间可进行双向数据传送数据的传输速率:各种被控器件均并联在总线上,通过器件地址(SLAVEAD

wanerXR的博客 4167

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【FPGA】基于IIC协议实现FPGA对EEPROM(24LC04B)的读写控制【附源码】

24LC04B是一种4kbit(2*256*8)容量的电可擦除PROM,该设备有两个256 x 8bit的存储块,具有2线串行接口(兼容IIC),支持最多写入16字节数据的页写功能, 兼容100kHz和400kHz的时钟速率,有16字节的页面写入缓冲区。

qq_46166093的博客 1508

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ZYNQ-FPGA-IIC协议及eeprom读写

IIC协议是传输中常见的协议,其包括了SCL 和SDA 两个引脚,它是一种半双工协议即可以收可以发但是不能同时进行。传输速度不高但较为简单。如上图,SCL与SDA 都连接着上拉电阻,因此当SCL、SDA空闲时候被上拉为高电平1,因此我们通常用0来表示有效。在SDA线上挂着许多元器件,这些元器件有自己的器件地址,因此主机可以通过器件地址找到设备。IIC协议的状态:1.空闲,SCL与SDA被上拉为高电平2.开始,当SCL为高电平时候,SDA 出现第一个下降沿表示起始信号。

weixin_48444982的博客 1648

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

FPGA开发(2)——IIC通信

FPGA开发之IIC通信

qq_40995480的博客 5751

通过eeprom验证FPGA实现的单字节/页读写IIC接口时序

本文档介绍了基于FPGA的I2C EEPROM读写模块的设计和验证。通过使用两个按键控制,实现了对24C02 EEPROM的前64个地址的读写操作。文档详细描述了EEPROM的原理图、单字节和页读写时序,并展示了顶层模块的RTL视图。通过仿真和实际硬件测试,验证了I2C接口模块的设计正确性,包括单字节读写和页读写功能。资源消耗分析显示了模块的高效性。文档还提供了获取工程文件的方法,以便读者可以进一步研究和使用。

详解FPGA及硬件电路开发 1809

基于FPGA的I2C读写EEPROM

基于FPGA的I2C协议读写EEPROM

qq_54347584的博客 1316

基于FPGA的I2C协议——以EEPROM为例

基于FPGA的I2C协议------以EEPROM为例 文章目录基于FPGA的I2C协议------以EEPROM为例一、I2C硬件层二、I2C协议简介三、程序讲解1.程序目标2.状态机图示3.代码讲解总结 一、I2C硬件层 1、I2C为双线总线接口,仅有SCL(时钟线)、SDA(数据线)两根线。 2、其中两根线均为开漏输出, 均无输出高电平的能力,需要外界上拉电阻来输出高电平,SCL、SDA在空闲状态为高阻态。 3、在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。每个

weixin_52761825的博客 2166
上一篇: 【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现
下一篇: 【Linux踩坑日记】:ubuntu环境下Linux系统没有网络连接,ifconfig查看发现只有lo,没有以太网eth0连接解决方法
白码王子小张
博客等级 码龄7年 6665粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值