⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.v

📁 三线spi接口
💻 V
字号:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date:    14:56:51 03/19/2009 // Design Name: // Module Name:    spi // Project Name: // Target Devices: // Tool versions: // Description: //// Dependencies: //// Revision: // Revision 0.01 - File Created// Additional Comments: /////////////////////////////////////////////////////////////////////////////////////***********************************************///SPI控制器,串行发送数据,更新CMOS内部寄存器/***********************************************/module spi( clk,				rst_n,				address_in,				data_in,				spi_clk,				spi_in,				spi_enable,
				finish_flag				);	input clk;							//模块主时钟;	input rst_n;						//模块复位信号;	input [3:0] address_in;			//接收待发送的地址;	input [11:0] data_in;			//接收待发送的数据;	output spi_clk,spi_in,spi_enable;	//SPI串行信号输出;	reg spi_clk,spi_in,spi_enable;
	output finish_flag;				//传递完毕标志位;
	reg finish_flag;		reg [3:0] address_buf;			//缓存接收到的地址信息;	reg [11:0] data_buf;				//缓存接收到的数据信息;	reg [6:0] counter32;				//计数器产生spienable使能信号;//	reg [2:0] counter3;				//计数器产生串行位流更新使能信号;	reg clk_div2;						//提供分频信号;	//主时钟二分频,作为spiclk的信号源		always @ (posedge clk or negedge rst_n)		begin			if(!rst_n)				clk_div2 <= 1'b0;			else				clk_div2 <= ~clk_div2;						end//通过计数器产生spienable信号	always @ (posedge clk or negedge rst_n)		begin			if(!rst_n)				counter16 <= 5'h00;			else if(counter32 <34)						counter32 <= counter32 + 5'h1;					else						counter32 <= 5'h00;		end	always @ (posedge clk or negedge rst_n)		begin			if(!rst_n)
				spi_enable <= 1'b0;
			else if(counter32 >=32)
						spi_enable <= 1'b1;
					else
						spi_enable <= 1'b0;		end
//generate spiclk signal;
	always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				spi_clk <= 1'b0;
			else if(!spi_enable)
						spi_clk <= ~spi_clk;
					else
						spi_clk <= 1'b0;
		end

//串行发送数据
	always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				spi_in <= 1'bz;
			else if(spi_enable)
						spi_in <= 1'bz;
					else
						case(counter32)
						0: spi_in <= address_buf[3];
						2: spi_in <= address_buf[2];
						4: spi_in <= address_buf[1];
						6: spi_in <= address_buf[0];
						8: spi_in <= data_buf[11];
					  10: spi_in <= data_buf[10];
					  12: spi_in <= data_buf[9];
					  14: spi_in <= data_buf[8];
					  16: spi_in <= data_buf[7];
					  18: spi_in <= data_buf[6];
					  20: spi_in <= data_buf[5];
					  22: spi_in <= data_buf[4];
					  24: spi_in <= data_buf[3];
					  26: spi_in <= data_buf[2];
					  28: spi_in <= data_buf[1];
					  30: spi_in <= data_buf[0];
						endcase
		end
//传递完成使能信号
	always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				finish_flag <= 1'b0;
			else if(counter32 >=32)						finish_flag <= 1'b1;					else						finish_flag <= 1'b0;				
		end//接收待发送的数据
	always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				begin
					address_buf <= 4'h00;
					data_buf <= 12'h00;
				end
			else if(spi_enable)
						begin
							address_buf <= address_in;
							data_buf <= data_in;
						end
					else
						begin
							address_buf <= 4'h00;
							data_buf <= 12'h00;
						end
						
		endendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -