#学习记录#
1 串并转换
实现串并转换的主要方式有双口RAM和FIFO,移位寄存器等。对于数据量较大的一般使用双端口RAM或者FIFO,对于数据量较小的使用移位寄存器实现。
2 使用位移寄存器实现数据串并转换
2.1 串行数据转并行数据
串行数据转并行数据的电路图如图1所示:
图1 串行数据转并行数据电路图
2.1.1 代码
`timescale 1ns / 1ps
//
// Company:
// Engineer: Mr-pn-junction
//
// Create Date: 2023/11/30 08:50:13
// Design Name:
// Module Name: serial_parallel
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module serial_parallel(
input clk,
input rst_n,
input en,
input data_in,
output reg [7:0] data_out
);
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
data_out <= 8'b0;
else if (en)
data_out <= { data_out[6:0],data_in};
else
data_out <= data_out;
end
endmodule
2.1.2 testbench
`timescale 1ns / 1ps
//
// Company:
// Engineer: Mr-pn-junction
//
// Create Date: 2023/11/30 09:09:48
// Design Name:
// Module Name: serial_parallel_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module serial_parallel_tb( );
reg clk;
reg rst_n;
reg en;
reg data_in;
wire [7:0] data_out;
serial_parallel test(
.clk(clk),
.rst_n(rst_n),
.en(en),
.data_in(data_in),
.data_out(data_out)
);
initial begin
clk = 1'b0;
rst_n = 1'b0;
en = 1'b0;
data_in = 0;
#20
rst_n = 1'b1;
#4
en = 1'b1;
#1000
$stop;
end
always #5 clk = ~clk;
always #10 data_in = ~data_in;
endmodule
2.1.3 仿真结果
2.2 并行数据转串行数据
并行数据转串行数据的电路如图2所示:
图2 并行数据转串行数据电路
2.2.1 代码
`timescale 1ns / 1ps
//
// Company:
// Engineer: Mr-pn-junction
//
// Create Date: 2023/11/30 10:21:06
// Design Name:
// Module Name: parallel_serial
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module parallel_serial(
input clk,
input rst_n,
input en,
input [7:0] data_in,
output data_out
);
reg [7:0] data_buf;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_buf <=8'b0;
else if(en)
data_buf = data_in;
else
data_buf <= data_buf <<1;
end
assign data_out = data_buf[7];
endmodule
2.2.2 testbench
`timescale 1ns / 1ps
//
// Company:
// Engineer: Mr-pn-junction
//
// Create Date: 2023/11/30 10:45:40
// Design Name:
// Module Name: parallel_serial_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module parallel_serial_tb( );
reg clk;
reg rst_n;
reg en;
reg [7:0] data_in;
wire data_out;
parallel_serial test(
.clk(clk),
.rst_n(rst_n),
.en(en),
.data_in(data_in),
.data_out(data_out)
);
initial begin
clk = 1'b0; en = 1'b0; rst_n = 1'b0;data_in = 8'b0;
#10
rst_n = 1'b1;data_in = 8'b1010_1010;
#4
en = 1'b1;
#10
en = 1'b0;
#1000
$stop;
end
always #5 clk = ~clk;
endmodule
2.2.3 仿真结果
参考文献
[1] Verilog HDL高级数字设计第二版. Michael D.Ciletti .电子工业出版社.