16位桶形(循环)移位寄存器Verlog程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合过程要在速度与面积之间进行折中考虑。“资源共享”是面积的优化技术。在设计中牺牲一些硅片的面积,往往会增加速度。下面是一个16位的桶形移位寄存器,(1)是优化前的代码(2)是优化后的代码
优化代码使用了两级复用器,其速度得到提高。复用器共2级个4选一复用器。对第一级,对输入数据进行0,1,2或3位循环移位;第二级,对输入进行0,4,8,12位的循环移位。
(1)优化前的桶形移位寄存器
module barrel_org(S,A_P,B_P);
input[3:0]S;
input[15:0]A_P;
input{15:0]B_P;
reg[15:0]B_P;
always@(A_P or S)
begin
case(S)
4'b0000:
begin
B_P<=A_P;
end
4'b0001:
begin
B_P[15]<=A_P[0];
B_P[14:0]<=A_P[15:1];
end
4'b0010:
begin
B_P[15:14]<=A_P[1:0]; B_P[13:0]<=A_P[15:2]; end
4'b0011:
begin
B_P[15:13]<=A_P[2:0]; B_P[12:0]<=A_P[15:3]; end
4'b0100:
begin
B_P[15:12]<=A_P[3:0]; B_P[11:0]<=A_P[15:4]; end
4'b0101:
begin
B_P[15:11]<=A_P[4:0]; B_P[10:0]<=A_P[15:5]; end
4'b0110:
begin
B_P[15:10]<=A_P[5:0]; B_P[9:0]<=A_P[15:6]; end
4'b0111:
begin
B_P[15:9]<=A_P[6:0]; B_P[8:0]<=A_P[15:7]; end
4'b1000:
begin
B_P[15:8]<=A_P[7:0]; B_P[7:0]<=A_P[15:8]; end
4'b1001:
begin
B_P[15:7]<=A_P[8:0]; B_P[6:0]<=A_P[15:9]; end
4'b1010:
begin
B_P[15:6]<=A_P[9:0]; B_P[5:0]<=A_P[15:10]; end
4'b1011:
begin
B_P[15:5]<=A_P[10:0]; B_P[4:0]<=A_P[15:11];
end
4'b1100:
begin
B_P[15:4]<=A_P[11:0]; B_P[3:0]<=A_P[15:12]; end
4'b1101:
begin
B_P[15:3]<=A_P[12:0]; B_P[2:0]<=A_P[15:13]; end
4'b1110:
begin
B_P[15:2]<=A_P[13:0]; B_P[1:0]<=A_P[15:14]; end
4'b1111:
begin
B_P[15:1]<=A_P[14:0]; B_P[0]<=A_P[15];
end
default:
B_P]<=A_P;
endcase
endmodule
(2)优化后的桶形移位寄存器
module barrel_org(S,A_P,B_P); input[3:0]S;
input[15:0]A_P;
input{15:0]B_P;
reg[15:0]B_P;
wire[1:0]SEL1,SEL2;
reg[15:0]C;
assign SEL1=S[1:0];
assign SEL2=S[3:2];
always@(A_P or SEL1)
begin
case(SEL1)
2'b00:
begin
C<=A_P;
end
2'b01:
begin
C[15]<=A_P[0];
C[14:0]<=A_P[15:1];
end
begin
C[15:14]<=A_P[1:0]; C[13:0]<=A_P[15:2]; end
2'b11:
begin
C[15:13]<=A_P[2:0]; C[12:0]<=A_P[15:3]; end
default:
C<<=A_P;
endcase
end
always@(A_P or SEL2)
begin
case(SEL2)
2'b00:
begin
B_P<=C;
end
2'b01:
begin
B_P[15:12]<=C[3:0];
B_P[11:0]<=C[15:4]; end
2'b10:
begin
B_P[15:8]<=C[7:0]; B_P[7:0]<=C[15:8]; end
2'b11:
begin
B_P[15:4]<=C[11:0]; B_P[3:0]<=C[15:12]; end
default:
B_P<=C;
endcase
end
endmoudle