Verilog实现serial数据到parallel数据转换,以及parallel数据到serial数据转换
实际应用中,很多数据都以串行方式传输,如I2C,LVDS,mini_LVDS等,读出时串行数据转换成并行数据传输,因而并串转换电路是个常用的电路。并串转换电路实际上是移位寄存器(shift register)的原理.在这里讨论将串行数据转换为并行数据的电路模块,同时分析并行数据转换为串行数据的代码
并行parallel数据转换为串行serial数据的电路
module p2s(clk,reset,load,pi,so);
input clk;
input reset;
input load;
input[3:0] pi;
output so;
reg[3:0] result;
[email=always@(posedge]always@(posedge[/email] clk or negedge reset)
if(!reset)
result <= 0;
else if(load==1) // 当load信号为1,且在clk rising 时将并行数送到了register中
result <= pi;
else
result <= {result,1'b0}; //设计中采用了位拼接运算符{},Verilog中有很多移位运算符,但以这种方式最为精简
assign so = result[3]; // 寄存器register中的数据送到输出端口
endmodule
以下是testbench内容 :
module p2s_tb;
reg clk;
reg reset;
reg load;
reg[3:0] pi;
wire so;
p2s ut(clk,reset,load,pi,so);
initial begin
$display($time,,"simulation is begining");
reset = 0;
#10;
reset = 1;
end
initial clk = 1'b0;
always #10 clk = ~clk;
initial begin
load = 1'b0;
pi = 4'b0;
#10;
load = 1'b1;
pi = 4'b0101;
#20;
load = 1'b0;
pi = 4'h0;
end
endmodule
以下为modelsim中的仿真波形
串进并出的代码如下:
module s2p(clk,resetn,en,si,po);
input clk;
input resetn;
input en;
input si;
output[3:0] po;
reg [8:0] r;
[email=always@(posedge]always@(posedge[/email] clk or negedge resetn)
if(!resetn)
r <= 8'h0;
else if(en)
r <={r,si};
assign po = (en) ? r : 4'h0;
endmodule
以下是testbench内容
`timescale 1ns/1ns
module s2p_tb;
reg clk;
reg resetn;
reg en;
reg si;
wire[3:0] po;
s2p ut(clk,reset,en,si,po);
initial begin
resetn = 0;
#5;
resetn = 1;
end
initial clk = 0;
always #10 clk = ~clk;
initial begin
en = 0 ;
si = 1 ;
#10;
si = 0;
#20;
en = 1;
si = 1;
#20;
si = 0;
#20;
si = 1;
#20;
si = 0;
#20;
si = 1;
#20;
si = 0;
end
endmodule |