spi 回环

///tx  极性0  (sclk信号线空闲时为低电平)
///     相位0 (在sclk信号线第一个跳变沿进行采样)
`timescale 1ns / 1ps

//两个从机  8'd01  8'd02
module top(
    input               clk  ,
    input               rst_n,
    input         [7:0] addr ,
    input               valid,
    input         [15:0]data ,
    output  reg         mosi ,
    output  reg    [1:0]cs   , //相当于是有2个从机 引脚约束的话是有2个
    output  reg         sclk 
    );
parameter CLK_DIV=100;
parameter IDEL = 2'b01;
parameter BUSY = 2'b10;
parameter cong1= 2'b01;
parameter cong2= 2'b10;
reg [1:0] state;
reg       fin  ;
reg       d    ;
reg [10:0]cunt1;
reg [9:0] cunt ;
reg [4:0] cunt_b;
//将valid信号延长
always @(posedge clk or negedge rst_n) begin
     if(state==IDEL)begin
         if(valid==1)
         d<=1;
         else
         d<=d;
     end
    else
    d<=0;        
end
always @(posedge clk or negedge rst_n) begin
    if(state==IDEL)begin
        if(d==1)
        cunt1<=cunt1+1;
        else
        cunt1<=cunt1;
    end
    else
    cunt1<=0;
end
//状态的转移
always @(posedge clk ) begin
    if(!rst_n)
    state<=IDEL;
    else if(state==IDEL&&cunt1==200)
    state<=BUSY;
    else if(state==BUSY&&fin==1)
    state<=IDEL;
    else
    state<=state;
end
//产生一个计数器对时钟周期计数
always @(posedge clk ) begin
    if(state==IDEL)
    cunt<=0;
    else begin
        if(cunt==CLK_DIV-1)
        cunt<=0;
        else
        cunt<=cunt+1;
        end
end
//对sclk计数
always @(posedge clk ) begin
    if(state==IDEL)
    cunt_b<=0;
    else begin
        if(cunt==CLK_DIV-1)
        cunt_b<=cunt_b+1;
        else
        cunt_b<=cunt_b;
    end
end
//sclk的产生
always @(posedge clk ) begin
    if(state==IDEL)
    sclk<=0;
    else if(fin==1)
    sclk<=0;
    else begin
    if(cunt<CLK_DIV/2)
    sclk<=1;
    else
    sclk<=0;
    end
end

//fin产生
always @(posedge clk) begin
    if(cunt==CLK_DIV-1&&cunt_b==15)
    fin<=1;
    else
    fin<=0;
end
//cs的产生
always @(posedge clk ) begin
    if(addr==8'd01)
    cs<=2'b01;
    else if(addr==8'd02)  //(state==BUSY||d==1)这个条件也可以不要 相当于只要选中一直拉高
    cs<=2'b10;
    else
    cs<=0;
end
//对mosi的输出
always @(posedge clk ) begin
    if(state==IDEL)
    mosi<=0;
    else case (cunt_b)
        0:mosi <=data[0]  ;
        1:mosi <=data[1]  ;
        2:mosi <=data[2]  ; 
        3:mosi <=data[3]  ;
        4:mosi <=data[4]  ;
        5:mosi <=data[5]  ;
        6:mosi <=data[6]  ;
        7:mosi <=data[7]  ;
        8:mosi <=data[8]  ;
        9:mosi <=data[9]  ;
        10:mosi<=data[10] ; 
        11:mosi<=data[11] ;
        12:mosi<=data[12] ;
        13:mosi<=data[13] ;
        14:mosi<=data[14] ;
        15:mosi<=data[15] ;
        default:mosi<=0; 
    endcase
end
endmodule

///rx
`timescale 1ns / 1ps
module rx_spi(
    input            clk  ,
    input            rst_n,
    input            mosi ,
    input            sclk ,
    input            cs   , //一位宽 例化的时候比如这个是从机连线就是cs[1]
    output reg [15:0]data ,
    output           valid        
    );
reg  [1:0]  sclk_t;
reg  [7:0]  cunt_b;
       
//对sclk_t缓存
always @(posedge clk or negedge rst_n) begin
    if(cs==1)
    sclk_t<={sclk_t[0],sclk};
    else
    sclk_t<=2'b00;
end
//对2'b10 这个下降沿计数
always @(posedge clk ) begin
    if(!rst_n)
    cunt_b<=0;
    else if(cs==1&&sclk_t==2'b10)
    cunt_b<=cunt_b+1;
    else
    cunt_b<=cunt_b;
end
//valid的产生
assign valid=(cs==1&&cunt_b==15);
//data的补充
always @(posedge clk ) begin
    if(cs==1) begin
        if(sclk_t==2'b10)
        case (cunt_b)
            0:data[0]<=mosi; 
            1:data[1]<=mosi;
            2:data[2]<=mosi;
            3:data[3]<=mosi;
            4:data[4]<=mosi;
            5:data[5]<=mosi;
            6:data[6]<=mosi;
            7:data[7]<=mosi;
            8:data[8]<=mosi;
            9:data[9]<=mosi;
            10:data[10]<=mosi;
            11:data[11]<=mosi;
            12:data[12]<=mosi;
            13:data[13]<=mosi;
            14:data[14]<=mosi;
            15:data[15]<=mosi;
            default: data=data;
        endcase
        else 
        data<=data;
    end
    else
    data<=0;
end
endmodule
//tb仿真激励文件
`timescale 1ns / 1ps
module tb(
    );
reg         clk  ;///
reg         rst_n;///
reg  [7:0]  addr ;///
reg         valid;///
reg  [15:0] data ;///
wire        mosi ;
wire [1:0]  cs   ;
wire        sclk ;  
initial begin
    clk=1    ;
    rst_n<=0 ;
    #100
    rst_n<=1 ;
    #100
    addr<=8'd02;
    valid<=1;
    data<=16'h1234;
    #20
    valid<=0;
end

always #10  clk=~clk ;
top u_top(
    /*input           */.clk  (clk  ),
    /*input           */.rst_n(rst_n),
    /*input     [7:0] */.addr (addr ),
    /*input           */.valid(valid),
    /*input     [15:0]*/.data (data ),
    /*output reg      */.mosi (mosi ),
    /*output reg [1:0]*/.cs   (cs   ),
    /*output reg      */.sclk (sclk )
    );
rx_spi u_rx1(
    /*input       */.clk  (clk  ),
    /*input       */.rst_n(rst_n),
    /*input       */.mosi (mosi ),
    /*input       */.sclk (sclk ),
    /*input       */.cs   (cs[1]), //一位宽 例化的时候比如这个是从机连线就是cs[1]
    /*output [7:0]*/.data ( ),
    /*output      */.valid( )        
    );
endmodule
 

仿真波形图
在这里插入图片描述
采样跳变沿笔记
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lc70--319.两个数组的交集(二分查找)---Java版

1.题目描述 2.思路 用集合求交集&#xff0c;因为集合里面的元素要满足不重复、无序、唯一。使得集合在去重、查找和集合操作&#xff08;如交集、并集、差集等&#xff09;中非常高效和方便。 3.代码实现 class Solution {public int[] intersection(int[] nums1, int[] nu…

项目2:简易随机数生成器 --- 《跟着小王学Python·新手》

项目2&#xff1a;简易随机数生成器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握P…

qml绘制折线图

参考链接 qml绘制折线图 在QML&#xff08;Qt Modeling Language&#xff09;中绘制折线图可以通过使用Canvas元素或ChartView元素来实现。以下是两种方法的示例&#xff1a; 方法一&#xff1a;使用Canvas元素 Canvas元素允许你在QML中绘制自定义图形。你可以通过JavaScrip…

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口&#xff0c;常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架&#xff0c;取代了Zuul网关。 1.1 SpringCloudGateway特点: &#xff08;1&#xff09;基于Spring5&#xff0c;支持响应…

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…

小试银河麒麟系统OCR软件

0 前言 今天在国产电脑上办公&#xff0c;需要从一些PDF文件中复制文字内容&#xff0c;但是这些PDF文件是图片转换生成的&#xff0c;不支持文字选择和复制&#xff0c;除了手工输入&#xff0c;我们还可以使用OCR。 1 什么是OCR OCR &#xff08;Optical Character Recogni…

小程序租赁系统打造便捷租赁体验助力共享经济发展

内容概要 小程序租赁系统是一个极具创新性的解决方案&#xff0c;它通过简化租赁过程&#xff0c;让物品的共享变得便捷流畅。对于那些有闲置物品的用户来说&#xff0c;他们可以轻松发布自己的物品&#xff0c;让其他需要的人快速找到并租借。而对于找东西的人来说&#xff0…

Spring Boot汽车资讯:科技与汽车的新篇章

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

【Python绘图】两种绘制混淆矩阵的方式 (ConfusionMatrixDisplay(), imshow()) 以及两种好看的colorbar

在机器学习领域&#xff0c;混淆矩阵是一个评估分类模型性能的重要工具。它不仅展示了模型预测的准确性&#xff0c;还揭示了模型在不同类别上的表现。本文介绍两种在Python中绘制混淆矩阵的方法&#xff1a;ConfusionMatrixDisplay() 和 imshow()&#xff0c;以及两种好看的co…

【Nginx从入门到精通】03 、安装部署-让虚拟机可以联网

文章目录 总结一、配置联网【Minimal 精简版】1.1、查看网络配置1.2、配置ip地址 : 修改配置文件 <font colororange>ifcfg-ens33Stage 1&#xff1a;输入指令Stage 2&#xff1a;修改参数Stage 3&#xff1a;重启网络Stage 4&#xff1a;测试上网 二、配置联网【Everyth…

android studio无法下载,Could not GET xxx, Received status code 400

-- 1. 使用下面的地址代替 原地址: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-all.zip 镜像地址: distributionUrlhttps\://downloads.gradle-dn.com/distributions/gradle-6.5-all.zips 上面的已经不好用了 https\://mirrors.cloud.tencent.c…

Cursor安装Windows / Ubuntu

一、安装 1、下载软件 2、安装依赖 #安装fuse sudo apt-get install fuse3、将cursor添加到应用程序列表 sudo mv cursor-0.42.5x86_64.AppImage /opt/cursor.appimage #使用自己版本号替换 sudo chmod x /opt/cursor.appimage #给予可执行权限 sudo nano /usr/share/applic…

2、计算机网络七层封包和解包的过程

计算机网络osi七层模型 1、网络模型总体预览2、数据链路层4、传输层5.应用层 1、网络模型总体预览 图片均来源B站&#xff1a;网络安全收藏家&#xff0c;没有本人作图 2、数据链路层 案例描述&#xff1a;主机A发出一条信息&#xff0c;到路由器A&#xff0c;这里封装目标MAC…

Elastic 和 Red Hat:加速公共部门 AI 和机器学习计划

作者&#xff1a;来自 Elastic Michael Smith 随着公共部门组织适应数据的指数级增长&#xff0c;迫切需要强大、适应性强的解决方案来管理和处理大型复杂数据集。人工智能 (Artificial intelligence - AI) 和机器学习 (machine learning - ML) 已成为政府机构将数据转化为可操…

【蓝桥杯备赛】深秋的苹果

# 4.1.1. 题目解析 要求某个区间内的数字两两相乘的总和想到前缀和&#xff0c;但是这题重点在于两两相乘先硬算&#xff0c;找找规律&#xff1a; 比如要算这串数字的两两相乘的积之和&#xff1a; 1, 2, 3 1*2 1*3 2*3 1*(23) 2*3 前缀和数组&#xff1a; 1 3 6 发现…

迷你游戏作为电子学习中的趋势工具

多年来&#xff0c;电子学习的格局发生了显著变化&#xff0c;引入了新技术和方法&#xff0c;以更有效地吸引学习者。在这些创新中&#xff0c;迷你游戏的使用已成为一种动态趋势。迷你游戏是紧凑而专注的互动活动&#xff0c;越来越多地被整合到电子学习平台中&#xff0c;以…

6.C操作符详解,深入探索操作符与字符串处理

C操作符详解&#xff0c;深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾&#xff1a; C语言是什么&#xff1f;编程界的‘常青树’&#xff0c;它的辉煌你不可不知VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础…

无需Photoshop即可在线裁剪和调整图像大小的工具

Bitmind是一个灵活且易于使用的批量图像本地化处理器&#xff0c;经过抓包看&#xff0c;这个工具在浏览器本地运行&#xff0c;不会上传图片到服务器&#xff0c;所以安全性完全有保证。 它可以将图像调整到任何特定尺寸&#xff0c;并在必要时按比例裁剪。 这是一个在线工具…

Flink1.19编译并Standalone模式本地运行

1.首先下载源码 2.本地运行 新建local_conf和local_lib文件夹&#xff0c;并且将编译后的文件放入对应的目录 2.1 启动前参数配置 2.1.2 StandaloneSessionClusterEntrypoint启动参数修改 2.1.3 TaskManagerRunner启动参数修改 和StandaloneSessionClusterEntrypoint一样修改…