当前位置: 首页 > news >正文

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) beginif(state==IDEL)beginif(valid==1)d<=1;elsed<=d;endelsed<=0;        
end
always @(posedge clk or negedge rst_n) beginif(state==IDEL)beginif(d==1)cunt1<=cunt1+1;elsecunt1<=cunt1;endelsecunt1<=0;
end
//状态的转移
always @(posedge clk ) beginif(!rst_n)state<=IDEL;else if(state==IDEL&&cunt1==200)state<=BUSY;else if(state==BUSY&&fin==1)state<=IDEL;elsestate<=state;
end
//产生一个计数器对时钟周期计数
always @(posedge clk ) beginif(state==IDEL)cunt<=0;else beginif(cunt==CLK_DIV-1)cunt<=0;elsecunt<=cunt+1;end
end
//对sclk计数
always @(posedge clk ) beginif(state==IDEL)cunt_b<=0;else beginif(cunt==CLK_DIV-1)cunt_b<=cunt_b+1;elsecunt_b<=cunt_b;end
end
//sclk的产生
always @(posedge clk ) beginif(state==IDEL)sclk<=0;else if(fin==1)sclk<=0;else beginif(cunt<CLK_DIV/2)sclk<=1;elsesclk<=0;end
end//fin产生
always @(posedge clk) beginif(cunt==CLK_DIV-1&&cunt_b==15)fin<=1;elsefin<=0;
end
//cs的产生
always @(posedge clk ) beginif(addr==8'd01)cs<=2'b01;else if(addr==8'd02)  //(state==BUSY||d==1)这个条件也可以不要 相当于只要选中一直拉高cs<=2'b10;elsecs<=0;
end
//对mosi的输出
always @(posedge clk ) beginif(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) beginif(cs==1)sclk_t<={sclk_t[0],sclk};elsesclk_t<=2'b00;
end
//对2'b10 这个下降沿计数
always @(posedge clk ) beginif(!rst_n)cunt_b<=0;else if(cs==1&&sclk_t==2'b10)cunt_b<=cunt_b+1;elsecunt_b<=cunt_b;
end
//valid的产生
assign valid=(cs==1&&cunt_b==15);
//data的补充
always @(posedge clk ) beginif(cs==1) beginif(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;endcaseelse data<=data;endelsedata<=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 beginclk=1    ;rst_n<=0 ;#100rst_n<=1 ;#100addr<=8'd02;valid<=1;data<=16'h1234;#20valid<=0;
endalways #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

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

http://www.lryc.cn/news/486998.html

相关文章:

  • 数据库审计工具--Yearning 3.1.9普民的使用指南
  • JAVA接口代码示例
  • 【Android】Proxyman 抓 HTTP 数据包
  • 基于Java Springboot活力健身馆管理系统
  • Excel SUMIFS
  • 复制Qt项目后常见问题解决
  • C#-WPF 常见类型转换方法(持续更新)
  • Path does not exist: file:/D:/pythonProject/spark/main/datas/input/u.data
  • 物联网——UNIX时间戳、BKP备份寄存器、RTC时钟
  • 力扣 LeetCode 94. 二叉树的中序遍历(Day6:二叉树)
  • 删除缓存之后,浏览器显示登录新设备
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-04
  • Stable diffusion详细讲解
  • 软件工程期末复习-用例建模
  • 【Golang】——Gin 框架中的表单处理与数据绑定
  • hive-内部表外部表-详细介绍
  • Windows系统 ElasticSearch,分词器、Kibana安装
  • 黑马智数Day10
  • 网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机
  • MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
  • Visual Studio 圈复杂度评估
  • Springboot之登录模块探索(含Token,验证码,网络安全等知识)
  • golang调用模组程序实现交互输入自动化,获取imei及iccid
  • ACE之单例
  • 泷羽sec学习打卡-云技术基础1-docker
  • 7天掌握SQL - 第一天:数据库基础与SQL入门
  • A037-基于Spring Boot的二手物品交易的设计与实现
  • 【异常记录】Junitmock之InvalidUseOfMatchersException异常
  • Spring Boot3自定义starter
  • 掌控 Solidity:事件日志、继承和接口的深度解析