面试题17--串并转换

一.移位寄存器(shift register)

1.1作用

【1】寄存器充当一组数据位的临时存储设备;
【2】对于每个输入时钟脉冲,移位寄存器用于将数据左移或右移一位;
【3】并行加载是指一次加载一个寄存器的所有触发器;
【4】串行加载是指一次将一个寄存器的触发器加载一位;
【5】将寄存器的所有位完全移入或移出寄存器所需的时钟脉冲数等于寄存器中的触发器数

1.2四种基本的寄存器配置

【1】并行输入,并行输出;
【2】串行输入,串行输出(左移和右移);
【3】并行输入,串行输出(右移);
【4】 串行输入,并行输出(右移)。

面试题17--串并转换_第1张图片

二.串并转换

可以通过移位寄存器执行此并行到串行转换和串行到并行转换
面试题17--串并转换_第2张图片

2.1并行(parallel-to-serial)到串行转换
【1】为了构造一个右移位寄存器,每个触发器(Q端)的输出必须连接到其右边的触发器的输入(J和K或D)。
【2】移位寄存器还必须将所有时钟输入连接到一个公共时钟信号,这样它们都将同时改变状态;
【3】每个触发器的异步输入(置位(set)和复位(reset))可用于提供并行负载;
【4】右移位寄存器的输出将出现在LSB的Q输出处。 LSB将首先出现在输出中;
【5】左移位寄存器的输出将出现在MSB的Q输出处。 MSB将首先出现在输出中。

注:LSB(Least Significant Bit)是“最低有效位”。MSB(Most Significant Bit)是“最高有效位”。

2.2循环寄存器(Recirculating Register)
通过将串行输出(LSB的Q和 Q’)连接回串行输入(MSB的J和K),可以构造一个循环寄存器。在再循环寄存器中,原始数据不会丢失。

2.3串并转换
【1】通过读取每个触发器的Q输出,可以从寄存器中获取并行数据;
【2】通过一次将一位施加到右移寄存器的MSB输入,可以将串行数据施加到移位寄存器。
【3】对于左移寄存器,必须一次在LSB处一次输入数据。
【4】选通线用于使能时钟,以便每个数据位只对寄存器移位一次。
面试题17--串并转换_第3张图片
注:load为并行数据使能信号
【1】当load=1时,load’=0,load’信号经过反相器后变为高电平load’,以下几个门失去作用,寄存器的每个触发器输入端将被置位指定的数据(这里是D0…)
面试题17--串并转换_第4张图片
【2】当load=0时,load’=1,那么此时容易知每个触发器的输入端均为0.

三.verilog代码实现:

3.1 16位右移位寄存器

module sif_reg_16(
	input clk,
	input rst_n_n,
	input[15:0] din,
	output[15:0] reg dout
	);

always @(posedge clk or negedge rst_n) begin
	if (rst_n) begin
		// reset
		dout<=16'b0;
		
	end
	else begin
		dout<={dout[0],dout[15:1]};
	end
end

endmodule

3.2 串行输入并行输出寄存器
下面描述一个位宽为8的串行输入并行输出的寄存器,其实现的功能为:
1位数据的串行输入,8位数据的并行输出。当时钟上升沿到达时,1位输入数据din进入qtemp的最低位,qtemp的其余各位依次向左移动1位,在assign 赋值语句中,将qtemp连续赋值给dout,实现8位的数据并行输出。

module left_shifter_reg(clk, din, dout);  
     input clk;  
     input din;  
     output [7:0] dout;  
     reg [7:0] qtemp;  
 
    always @ (posedge clk)  
        begin  
            qtemp <= {qtemp[6:0], din}; //每次输入一位  
        end  
     assign dout = qtemp; //并行输出  

 endmodule

3.3并行输入串行输出移位寄存器
下面描述一个位宽为8的并行输入串行输出的寄存器,其实现的功能为:当使能端 en = 1时,将输入数据din存入一个8位的中间变量,然后在每个时钟上升沿到来时,将qtemp的最低端输出,然后再将qtemp右移一位,从而实现将din输入数据从最低位到最高位依次串行输出。


module right_shifter_reg(clk, en, din, dout);  
 
     input [7:0] din;  
 
     input en,clk;  
 
     output dout;  
 
     reg dout;  
 
     reg [7:0] qtemp;  
 
     always @(posedge clk)  
         begin  
             if(en == 1)  
                 qtemp <= din;  
             else  
                 begin  
                     dout <= qtemp[0];  
 
                    qtemp <= {qtemp[0], qtemp[7:1]};  
                 end  
         end  
 
 endmodule

参考文献:
【1】https://blog.csdn.net/Reborn_Lee/article/details/80377919
【2】https://grace.bluegrass.kctcs.edu/~kdunn0001/files/Shift_Registers/Shift_Registers7.html
【3】https://www.globalspec.com/learnmore/semiconductors/logic/digital_parallel_serial_converters

你可能感兴趣的:(IC笔试常考题目)