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

📄 shift_r1.v

📁 基于QUARTUSII软件 实现FPGA(ATERA CYCLONE II系列)与SD卡SD模式通信源码
💻 V
字号:
/**************************************************

 函数名:shift_r1
 功  能:实现数据的串行输入并行输出
 参数说明:clk      时钟
           flag     标志信号,当完整接收到一个回答信号后则由此发出一个脉冲
           data_in  输入的数据
           data_out 输出的数据
           en       使能信号,1时有效
           rst      复位信号,可以利用time1ms_fg的上升沿
***************************************************/

module shift_r1(rst,clk,data_in,data_out48,data_out136,flag,en,cmd_num);

parameter len1=48;
parameter len2=136;

input     clk,en,data_in,rst;
input     [3:0]cmd_num;
output    flag;
output    [len1-1:0]data_out48;
output    [len2-1:0]data_out136;
integer   j,n;
reg       [len1-1:0]temp48,data_out48;
reg       [len2-1:0]temp136,data_out136;
reg       [3:0]temp_num;
reg       flag,receive_en;

always @(posedge clk)
	begin
	if(!rst)
		begin
		receive_en<=1'b0;
		temp_num<=4'b0000;
		end
	else
		begin
		if((!en) && (!data_in))
			begin
			receive_en<=1'b1;
			temp_num<=cmd_num;
			end
		else if(flag==1'b1 || en==1'b1)
			receive_en<=1'b0;
		else
			receive_en<=receive_en;
		end
	end
		
always @(posedge clk)
	begin
	if(rst==1'b1)
		begin
		if(temp_num!==4'b0100 && temp_num!==4'b0110)
			begin
			if(receive_en==1'b1 && j<len1-1)
				begin
				temp48[len1-2-j]<=data_in;                  //检测到开始位到开始接收会有一个时钟的延时
				j<=j+1;
				end
			else if(j>=len1-1)		                                      //故第一位不在接收
				begin
				j<=0;
				flag<=1'b1;
				end
			else if(receive_en==1'b0)
				begin
				flag<=1'b0;
				j<=1'b0;
				end
			end
		else if(temp_num==4'b0100 || temp_num==4'b0110)
			begin
			if(receive_en==1'b1 && j<len2-1)
				begin
				temp136[len2-2-j]<=data_in;                  //检测到开始位到开始接收会有一个时钟的延时
				j<=j+1;
				end
			else if(j>=len2-1)		                                      //故第一位不在接收
				begin
				j<=0;
				flag<=1'b1;
				end
			else if(receive_en==1'b0)
				begin
				flag<=1'b0;
				j<=1'b0;
				end
			end
		end
	else
		begin
		j<=1'b0;
		flag<=1'b0;
		temp48<=48'b0;
		temp136<=136'b0;
		end
	end

always @(posedge flag)
	begin
	if(temp_num!==4'b0100 && temp_num!==4'b0110)
    	data_out48<=temp48;
	else if(temp_num==4'b0100 || temp_num==4'b0110)
		data_out136<=temp136;
	end
//confirmpulse pluse( clk, rst, fll, flag, pulsewide );

endmodule

⌨️ 快捷键说明

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