Verilog如何用移位操作符"<<"或">>"来实现串并4bit数据的串入并出?

小弟自己写了一个简单的模块,但是总是不能获得正确的结果,贴在这里,各位大大帮忙看一下有什么问题!谢谢了!
module Serial_to_Para(S_In,S_CLK,P_Out);
input S_In,S_CLK;
output[3:0] P_Out;
reg[3:0] In_Buff;
always @ (posedge S_CLK)
begin
In_Buff <= (In_Buff+S_In)<<1;
end

assgin P_Out=In_Buff;
endmodule

个人总是感觉移位之前的+操作有点问题,但因为知识比较欠缺,一下子说不上来问题在哪儿。麻烦大家帮忙看看了~

恩 移位寄存器的话这里有两个例子,楼主你参考一下
第一个是用位拼接符来做的,在百度上输入“Verilog 串并转换”很容易就查到了,这个是别人的函数,我把名字换成你的,可以直接用到自己的应用中。
module Serial_to_Para(clk,reset,en,in,out);
input clk,reset,en,in;
output[3:0] out;
reg[3:0] out;
always @(posedge clk)
begin
if(reset)
out<=4'h0;
else
if(en)
out<={out[2:0],in}; //使用连接运算符
end
endmodule
上面那个out<={out[2:0],in};这一句可以换成out<={in,out[3:1]};这样就变成了从高位移入,很容易改成双向移位寄存器。

另外一种是比较贴近楼主设计思想的代码例子了,在百度可以搜到,这里放出来你可以参考一下。
module Serial_to_Para(clk,rst,in,out)

input clk,rst;
input in;
output[3:0] out;

wire[3:0] out;
reg [3:0] shiftreg;

always@(posedge clk or negedge rst) // 异步清零
if(!rst)
shiftreg<=0;
else begin
shiftreg[0]<=in;
shiftreg[1]<=shiftreg[0];
shiftreg[2]<=shiftreg[1];
shiftreg[3]<=shiftreg[2];
end

assign out=shiftreg;

endmodule

猜测一下,楼主想要使用“<<”运算符是为了达到D触发器级联实现串并转换的效果对吧?如果是的话那么第二个例子刚好是这个了。对于你的代码中<<操作造成仿真结果不正确的情况,还暂时没分析出来是怎么回事。可以等等看有没有人可以帮到你。如果只是需要找到替代算法的话,希望上面两个例子可以对你有帮助。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-23
应该用并置运算,这不是一个数值相加的关系。
In_Buff <= (In_Buff+S_In)<<1;一句修改为 In_Buff <= {In_Buff[2:0], S_in};
相当于一个移位寄存器组
相似回答