串并转换都是利用移位寄存器。本文拿四位串并转换举例。
串转并就是将低3位信号和输入信号一起赋值。因为经过转换后,码元速率会将为原来四分之一,所以设置4分频时钟,将其输出。而并转串就是不断右移,取高位输出。
串转并
module serial_par(
input clk,
input d,
output reg [3:0]q
);
//四分频模块
reg [13:0]cnt;
parameter N = 4;
reg clk_out;
always @(posedge clk)
begin
if(cnt == N/2 - 1)begin
cnt <= 14'b0;
clk_out <= ~clk_out;
end
else
cnt <= cnt + 1'b1;
end
reg [3:0]data;
always @(posedge clk)
begin
data <= {data[2:0],d};
end
always @(posedge clk_out)
begin
q <= data;
end
endmodule
并转串
module par_serial(
input clk,
input [3:0]d,
input en,
output q
);
reg[3:0]data;
always @(posedge clk)
begin
if(en)
data <= d;
else
data <= data << 1;
end
assign q = data[3];
endmodule
其中en为输入有效脉冲,每四个脉冲输出高电平,如下
reg[2:0]cnt;
always @(posedge clk)
begin
if(cnt == 3)begin
en <= 1;
cnt <= 0;
end
else begin
en <= 0;
cnt <= cnt + 1'b1;
end
end
大家可以自己产生一个01序列,进行串并转换后,再并串转换,就能得到原序列,以此作为测试。
相信大家在理解本文后,就知道8位或是更高位数的串并转换应该怎么写了。只用修改相应寄存器位数,对应时钟分频、脉冲信号即可。