SPI协议 小白简单 verilog 编写

  • SPI 小白速度理解原理········  

 

    1   :  通讯原理。 (主从模式)

 

 

        sclk         : 作为spi的专用时钟传输.

        mosi       : 主机发送给从机的数据线.(单bit)

        miso       : 从机发送给主机的数据. 

        ssel        : 主机选定器件信号. (一般高有效)  

 2    : 发送数据 (根据手册定义的 地址,命令,数据,)

               这个是DAC3283芯片手册   (这个是数据)

 

 3   : 代码编写  (代码里面没有根据手册定义) (只是简单的定义了测试数据)

        代码很简单 ,易懂    (上升沿采集,下降沿输出)            -.-只写了输入,没写输出嘻嘻

//spi 简单理解代码 . 

module spi (
input wire   clk,
input wire   rst,
input wire   spi_key,      //开始信号
output reg   spi_done,     //一帧数据完成信号
output wire  spi_cs,
output wire  spi_clk,
output wire  spi_sdi,
output wire  spi_sdo
);

wire          clk_n;     //时钟P取反数据  

reg   [4:0]   state;     //状态
reg   [4:0]   cnt_1hmz;  //计数25-1位
reg     	     clk_p;     //时钟p
reg	             clk_flag;  //时钟P脉冲信号
reg   [3:0]   wait_cnt;  //数据计数器
reg   [4:0]   cnt;       //等待时间计数器

//*****************临时测试数据  具体发送协议查看芯片手册
reg   [2:0]   addr;      //临时测试地址寄存器   7
reg   [7:0]   data;      //临时测试数据寄存器   255
//*************************************************

// 数据 spi寄存器
reg 		     cs;
reg		 	  sdo;
//****************

//**************状态机定义
parameter       IDLE   = 5'b0_0001,  //开始 
			    WAIT   = 5'b0_0010,  //等待
			    R_MEM  = 5'b0_0100,  //发送地址
			    W_REG  = 5'b0_1000,  //写进数据
			    STOP   = 5'b1_0000;  //停止

// 寄存器赋值		 
assign spi_cs     =     cs   ;
assign spi_clk    =     clk_n;
assign spi_sdo    =     sdo  ;

//****************************************************** 时间定义
always @ (posedge clk ) begin 
if (rst)
  cnt_1hmz <= 0;
else if (cnt_1hmz == 25-1)
  cnt_1hmz <= 0;
else 
  cnt_1hmz <= cnt_1hmz + 1;
end 
  
always @ (posedge clk ) begin 
if (rst)
  clk_p    <= 0;
else if (cnt_1hmz == 25-1 && state == W_REG)
  clk_p    <= ~clk_p;
else if (state !=W_REG && cnt_1hmz == 25-1)
  clk_p    <= 0;
end 

assign clk_n = !clk_p;


always @ (posedge clk) begin 
if (rst)
 clk_flag <= 0;
else if (cnt_1hmz == 25-1 && clk_p==0)
 clk_flag <= 1;
else 
 clk_flag <= 0;
end 
 
//****************************************************** 状态机
always @ (posedge clk) begin 
if (rst)
 begin 
  state    <= IDLE;
  sdo      <= 0;
  wait_cnt <= 0;
  cnt      <= 0;
  data     <= 0;
  addr     <= 0;
  spi_done <= 0;
 end 
else 
 case (state)
    IDLE     : if (spi_key && clk_flag)
					state <= WAIT;
				  else 
					state <= IDLE;
					 
	WAIT   	 : if (cnt == 31-1 && clk_flag)
					begin 
					state <= R_MEM;
					cnt   <= 0;
					end 
				  else 
				   begin 
				    state <= WAIT;
					 cnt   <= cnt + 1;
					end 
					
	R_MEM    :  if (clk_flag)
					begin 
					state <= W_REG;
					addr  <= 2;
					data  <= 8'b1010_1100;
					end 
				  else 
				    state <= R_MEM;
					
	W_REG    : if (clk_flag)
					begin 
					wait_cnt <= wait_cnt + 1;
					data <= {data[6:0],1'b1};
					sdo  <= data[7];
					end 
				  else if (wait_cnt == 8)
				  
				   state <= STOP;
				
	STOP     :   		 begin 
							 state <= STOP; 
							 spi_done <= 1; 
							 end 
	
	default :  ;
endcase 
end 

//***************************************cs使能开启
always @ (posedge clk ) begin 
if (rst)
 cs <= 0;
else if (state == W_REG && clk_flag)
 cs <= 1;
else if (state == STOP && clk_flag)
 cs <= 0;
end 


endmodule 

4  :  波形图显示 

       看带颜色的就可以了。。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小五头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值