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

📄 serial_rd.v

📁 运用FPGA控制AD9957的操作
💻 V
字号:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date:    09:23:42 12/05/2007 // Design Name: // Module Name:    serial_rd // Project Name: // Target Devices: // Tool versions: // Description: //// Dependencies: //// Revision: // Revision 0.01 - File Created// Additional Comments: ////////////////////////////////////////////////////////////////////////////////////module serial_rd(clk, nrst, addr, dout, start, ncs, sclk, sdio, gend);    input clk;    input nrst;    input addr; 
	input start;    
	output [7:0] dout;    output ncs;    output sclk;    output sdio;    output gend;		reg [7:0] dout;    reg ncs;    reg sclk;    reg sdio;    reg gend;
	////////////////////////////////////////////////////////////////////////////////
	reg g_addr_data;	reg [7:0] shift_data,shift_cnt;	reg [4:0] state_cur,state_next;	parameter 	STATE_IDLE = 5'b00000,				STATE1 = 5'b0001,				STATE2 = 5'b0010,				STATE3 = 5'b0011,				STATE4 = 5'b0111,				STATE5 = 5'b0110,				STATE6 = 5'b0100,				STATE7 = 5'b0101,				STATE8 = 5'b1101,
				STATE9 = 5'b1101;	parameter LEN_WORD = 8;	reg[1:0] dly_cnt;	///////////////////////////////////////////////////////////////////////////	//assign	///////////////////////////////////////////////////////////////////////////	//	//////////////////////////////////////////////////////////////////////////	//fsm	always@(posedge clk,negedge nrst)	begin		if(!nrst)			state_cur <= STATE_IDLE;		else			state_cur <= state_next;	end	////////////////////////////////	//	always@(nrst,state_cur,shift_cnt,start,dly_cnt)	begin		if(!nrst)			state_next <= STATE_IDLE;		else		begin			case(state_cur)				STATE_IDLE:				begin					if(start == 1)						state_next <= STATE1;					else						state_next <= STATE_IDLE;				end				/////////////////////////write addr/data to serial interface				STATE1:				begin						state_next <= STATE2;				end				STATE2:							//delay 4 clk period				begin					if(dly_cnt == 3)						state_next <= STATE3;				end				STATE3:                      	//delay 4 clk period				begin					if(dly_cnt == 3)						state_next <= STATE4;				end				STATE4:				begin					if(shift_cnt == 0)			// end to write 						state_next <= STATE5;					else						// continue to write						state_next <= STATE1;				end				/////////////////////////read data from serial interface				STATE5:				begin					state_next <= STATE6;				end				STATE6:							//delay 4 clk period				begin					if(dly_cnt == 3)						state_next <= STATE7;				end				STATE7:							//delay 4 clk period				begin					if(dly_cnt == 3)						state_next <= STATE8;				end				STATE8:				begin					if(shift_cnt != 0)           //continue to read data						state_next <= STATE5;					else                         //end to read data						state_next <= STATE9;				end				STATE9:				begin					if(start != 0)				//wait for end signal 						state_next <= STATE9;					else                    						state_next <= STATE_IDLE;				end				default:				begin					state_next <= STATE_IDLE;				end			endcase		end	end	//////////////////////////////////	always@(posedge clk)	begin		if(!nrst)			init;				else		begin			case(state_cur)				STATE_IDLE:				begin					init;				end				STATE1:				begin					ncs <= 1'b0;					sdio <= shift_data[shift_cnt];					sclk <= 1'b0;				end				STATE2:				begin					if(dly_cnt == 3)						dly_cnt <= 0;					else						dly_cnt <= dly_cnt + 1;				end				STATE3:				begin					sclk <= 1'b1;					if(dly_cnt == 3)						dly_cnt <= 0;					else						dly_cnt <= dly_cnt + 1;				end				STATE4:				begin					sclk <= 1'b1;					if(shift_cnt != 0)						shift_cnt <= shift_cnt - 1;
					else
						shift_cnt <= 3'b111;				end				////////////////////////read data from serial interface				STATE5:				begin					ncs <= 1'b0;					sclk <= 1'b0;				end				STATE6:							//delay 4 clk period				begin					if(dly_cnt == 3)						dly_cnt <= 0;					else						dly_cnt <= dly_cnt + 1;				end				STATE7:							//delay 4 clk period				begin					sclk <= 1'b1;					if(dly_cnt == 3)						dly_cnt <= 0;					else						dly_cnt <= dly_cnt + 1;				end				STATE8:				begin					dout[shift_cnt] <= sdio;				end				STATE9:				begin					gend <= 1'b1;				end				default:				begin				end			endcase		end	end	/////////////////////////////////////////	task init;	begin		ncs <= 1'b1;		sdio <= 1'b0;		sclk <= 1'b0;		gend <= 1'b0;		dout <= 8'b00000000;		shift_data <= addr;		shift_cnt <= LEN_WORD -1;	end	endtaskendmodule

⌨️ 快捷键说明

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