spi 回环

ops/2024/11/19 10:05:53/
///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.ppmy.cn/ops/134930.html

相关文章

ASUS/华硕灵耀X双屏Pro UX8402Z 原厂Win11-22H2系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

node.js知识点总结

1、Node.js Node. js是一个基于 Chrome v8引擎的服务器端 JavaScript运行环境&#xff1b;Node. js是一个事件驱动、非阻塞式I/O的模型&#xff0c;轻量而又高效&#xff1b;Node. js的包管理器npm是全球最大的开源库生态系统。 2、数据处理中的buffer&#xff1a; 具体…

Postman之数据提取

Postman之数据提取 1. 提取请求头\request中的数据2. 提取响应消息\response中的数据3. 通过正在表达式提取4. 提取cookies数据 本文主要讲解利用pm对象对数据进行提取操作&#xff0c;虽然postman工具的页面上也提供了一部分的例子&#xff0c;但是实际使用时不是很全面&#…

ssm135连锁经营商业管理系统+jsp.zip

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;连锁经营商业管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本连锁经营商业…

成本400元,DIY一个高刷新率热成像相机

在市面上开源的热成像作品中&#xff0c;有一部分颜值高&#xff0c;但分辨率太低&#xff1b;也有一部分把分辨率提高了&#xff0c;但使用起来却不太流畅。 基于此&#xff0c;作者本人结合二者的优势&#xff0c;设计了一款热成像相机——LiThermal&#xff0c;成本算下来只…

基于YOLOv8深度学习的无人机视角军事打击目标检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着无人机技术的迅速发展及其在军事领域的广泛应用&#xff0c;精准目标检测逐渐成为现代战场中提升打击效能和战术决策的关键技术之一。无人机因其灵活性、机动性和高效性&#xff0c;已经成为现代战争中不可或缺的侦察与打击工具。在复杂多变的战场环境中&#xff0c;及时、…

使用 IntelliJ IDEA 编写 Spark 应用程序(Scala + Maven)

使用 IntelliJ IDEA 编写 Spark 应用程序&#xff08;Scala Maven&#xff09; 本教程演示如何使用 IntelliJ IDEA 和 Maven 编写 Spark 应用程序&#xff08;以 WordCount 程序为例&#xff09;。运行环境为 Ubuntu 16.04。 环境准备 安装 IntelliJ IDEA &#xff08;1&am…

【算法设计与分析】期末复习题

试证明&#xff1a;10n的平方-2nΘ&#xff08;n的平方&#xff09; 2.为什么用分治法设计的算法一般有递归调用? 答&#xff1a;子问题的规模很大时&#xff0c;必须继续使用分治法&#xff0c;反复分治&#xff0c;必然要用到递归。 3.衡量一个算法优劣的主要性能标准有哪…