📄 shift_r1.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 + -