串并转换

数字IC经典电路设计
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。快速导航链接如下:
一、前言
数字电路中的串并转换主要设计思想来源于用面积换速度,对数据流进行管理。实现串并转换的主要方式有双口RAM,FIFO,移位寄存器等,对于数据量较大的一般使用双口RAM或者FIFO实现,数据量较小的使用移位寄存器实现。
在设计的时候主要包括以下两个模块
- 核心模块:对于移位寄存器法,每个时钟周期将1bit数据缓存在寄存器上,选择不同的转换优先方式数据缓存的方式不同。选择msb优先的情况下,数据将会从高位向低位依次缓存,相当于数据不断地右移,lsb优先则相反。对于计数器法,相比于移位寄存器逐次移位进行拼接,计数器法通过计数器将输入的数据直接缓存到对应的位次。
- 辅助模块:由于串并行数据输入输出的特性,输入的时钟周期与输出时钟周期是不同的。以8-1串并串入并出转换为例,每个时钟周期输入1bit数据,在8个时钟周期后数据全部并行输出。此时,有两种方法可以选择:一是借用使能信号,二是借用分频器。前者简单但是灵活性稍差,此处采用后者进行设计。此处详细设计可以参考数字分频器设计。
二、串行输入并行输出转换
2.1 移位寄存器实现串行输入并行输出
2.11移位寄存器实现串行输入并行输出
根据移位寄存器的原理,每个时钟周期将1bit数据缓存在寄存器上,对于选择msb优先和lsb优先:
dout_msb_r <= {dout_msb_rWIDTH - 2 :0,din_r};
dout_lsb_r <= {din_r,dout_lsb_rWIDTH - 1 :1};
然后在8分频时钟信号下由时序逻辑输出。
2.12 verilog代码
//1-8串并转换器
module sipo_sr #(
parameter WIDTH = 8
)(
input clk,
input rst_n,
input din,
output reg [WIDTH - 1 : 0] dout_msb,//高位优先输出
output reg [WIDTH - 1 : 0] dout_lsb//低位优先输出
);
//计数器实现的8分频模块(开始
//计数器
reg [3:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 4'b0 ;
end
else if (cnt == 3) begin
cnt <= 4'b0 ;
end
else begin
cnt <= cnt + 1'b1 ;
end
end
//信号翻转生成8分频信号
reg clk_div8_r;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
clk_div8_r <= 1'b0;
end
else if (cnt == 3 ) begin
clk_div8_r <= ~clk_div8_r;
end
end
assign clk_div8 = clk_div8_r;
//计数器的8分频模块(结束
//移位寄存器模块(开始
//输入先寄存一拍
reg din_r;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
din_r <= 1'b0;
end
else begin
din_r <= din;
end
//最高位优先输出
reg [WIDTH - 1 : 0] dout_msb_r;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
dout_msb_r <= 0;
end
else begin
dout_msb_r <= {
dout_msb_r[WIDTH - 2 :0],din_r};
end
end
//最低位优先输出
reg [WIDTH - 1 : 0] dout_lsb_r;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
dout_lsb_r <= 0;
end
else begin
dout_lsb_r <= {
din_r,dout_lsb_r[WIDTH - 1 :1]};
end
end
//移位寄存器模块(结束
//时序逻辑输出
always@(posedge clk_div8 or negedge rst_n) begin
if(!rst_n) begin
dout_msb <= 0;
dout_lsb <= 0;
end
else begin
dout_msb <= dout_msb_r;
dout_lsb <= dout_lsb_r;
end
end
endmodule
2.13 Testbench
`timescale 1ns/1ps //仿真时间单位1ns 仿真时间精度1ps
module sipo_sr_tb #(
parameter WIDTH = 8
);
///信号申明
reg clk;
reg rst_n;
reg din;
wire [WIDTH - 1 : 0] dout_msb;
wire [WIDTH - 1 : 0] dout_lsb;
//模块实例化(将申明的信号连接起来即可)
siposr u_sipo_sr(
.clk (clk),
.rst_n (rst_n),
.din (din),
.dout_msb (dout_msb),
.dout_lsb (dout_lsb

本文详细介绍了数字集成电路设计中串行输入并行输出以及并行输入串行输出的转换方法,包括移位寄存器和计数器两种实现方式,并提供了Verilog代码示例和Testbench,以及仿真结果分析。
3496

被折叠的 条评论
为什么被折叠?



