1、确定题目要求

这是一道华为暑期实习真题,面试的时候被要求现场撸代码,不过由于是实习面试,因此相对比较简单

串并转换操作是非常灵活的操作,核心思想就是移位。串转并就是把1位的输入放到Nreg的最低位,然后Nreg左移一位,在把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



如果关于此次题单有问题或者反馈意见,欢迎加入牛客用户反馈群沟通~