一种串并转换的设计,通过移位寄存器实现。
目录
一、串并转换
串并转换是完成串行传输和并行传输这两种传输方式之间转换的技术,通常使用移位寄存器可以实现并行和串行输入和输出。 这些通常配置为“串行输入,并行输出”(SIPO)或“并行,串行输出”(PISO)。
串行数据输出是将组成数据和字符的码元按时序逐位予以传输。
并行数据传输是将固定位数(通常为8位或16位等)的数据和字符码元同时传输至接收端。
(1)串行并行输出(SIPO)
以串行格式输入数据。一旦数据被输入,它可以在每个输出同时读出,或者可以被移出。每个触发器都是边沿触发的,所有触发器以给定的时钟频率工作。每个输入位在N个时钟周期后下降到第N个输出,以实现并行输出。
并行输出在串行加载过程期间不应改变,期望使用锁存或者缓冲的输出。在锁存的移位寄存器中,串行数据首先被加载到内部缓冲寄存器中,然后在接收到加载信号时,缓冲寄存器的状态被复制到一组输出寄存器中。通常,串行输入/并行移位寄存器的实际应用是将数据从单线上的串行格式转换为多线上的并行格式。
(2)并行串行输出(PISO)
以并行格式输入数据。在将数据写入寄存器时,写/移位控制线必须暂时停止工作;为了实现移位,控制线则变为工作状态并且寄存器被锁定。只要时钟周期数不超过数据串的长度,数据输出Q将按顺序读出并行数据,需要区分LSB和MSB。
二、代码实现
上代码:
module transform(
input clk,rst_n,
input en1, // 串转并使能
input en2, // 并转串使能
input d1, // 串行输入
input [7:0] d2, // 并行输入
output reg [7:0] q1, // 并行输出,低位先转换,lsb
output reg [7:0] q2, // 并行输出,高位先转换,msb
output reg q3 // 串行输出
);
always@(posedge clk or negedge rst_n)begin //串转并
if(!rst_n)begin
q1 <= 8'b0;
q2 <= 8'b0;
end
else if(en1)begin
q1 <= {q1[6:0],d1};
q2 <= {d1,q2[7:1]};
end
else begin
q1 <= q1;
q2 <= q2;
end
end
reg [7:0] data_buf;
always@(posedge clk or negedge rst_n)begin //并转串
if(!rst_n)begin
data_buf <= 8'b0;
end
else if(en2)begin
data_buf <= d2;
end
else begin
data_buf <= data_buf << 1;
end
end
assign q3 = data_buf[7];
endmodule
这里给出了串转并和并转串各自的设计。转换具有各自的使能信号,并行输出的格式有两种lsb和msb。
测试波形: