1、确定题目要求
这是一道华为暑期实习真题,面试的时候被要求现场撸代码,不过由于是实习面试,因此相对比较简单
串并转换操作是非常灵活的操作,核心思想就是移位。串转并就是把1位的输入放到N位reg的最低位,然后N位reg左移一位,在把1位输入放到左移后的reg的最低位,这样循环,就可以得到,以最高位开始传输,最低位传输完成的N位数据了;并转串就是把并行的N位数据的最高位给1位输出,然后类似的循环左移就可以了。
2、写出v代码
module huawei5(
input wire clk ,
input wire rst ,
input wire [3:0]d ,
output wire valid_in ,
output wire dout
);
//*************code***********//
reg [3:0] data = 'd0;
reg [1:0]cnt;//计数
reg valid;
assign dout = data[3];//data的最高位接输出线
assign valid_in =valid;
always @(posedge clk or negedge rst) begin
if(!rst)begin
data<= 'd0;
cnt <= 'd0;
valid <= 'd0;
end
else begin
if (cnt == 'd3) begin
data <= d;//这里d是在cnt清零时给到data上传的
cnt <= 'd0;
valid <= 1;
end
else begin
cnt <= cnt + 'd1;
valid <= 0;
data <= {data[2:0],data[3]};//核心也是循环左移
end
end
end
//*************code***********//
endmodule
仿真结果如下:
`timescale 1ns/1ns module huawei5( input wire clk , input wire rst , input wire [3:0]d , output wire valid_in , output wire dout ); //*************code***********// reg [3:0] data = 'd0; reg [1:0]cnt;//计数 reg valid; assign dout = data[3];//data的最高位接输出线 assign valid_in =valid; always @(posedge clk or negedge rst) begin if(!rst)begin data<= 'd0; cnt <= 'd0; valid <= 'd0; end else begin if (cnt == 'd3) begin data <= d;//这里d是在cnt清零时给到data上传的 cnt <= 'd0; valid <= 1; end else begin cnt <= cnt + 'd1; valid <= 0; data <= {data[2:0],data[3]};//核心也是循环左移 end end end //*************code***********// endmodule