串并装换器的设计及仿真结果

来源:互联网 发布:程序员的职业素养 编辑:程序博客网 时间:2024/06/10 08:23

      串/并转换是高速数据流处理的重要技巧之一。串/并转换的实现方法多种多样,根据数据的的顺序和数量要求,可以选用寄存器,双扣RAM,SRAM,FIFO,等实现。对于

数量比较小的设计可以采用移位寄存器完成串/并转换。

      在工程中,如何体现串/并转换的设计思想呢? 怎样才能提高系统的处理速度呢 ?

      一个简单的串/并转换框架如下图所示,串行输入的数据通过FPGA内部的 n 个移位寄存器后,最后输出的是一个 n 位宽的并行总线数据

 

 

 

 

 

 

 

 

 

 

 

      移位寄存器是需要做时钟同步的,也就是说,n 个时钟采样到的串行数据需要在 n 个时钟周期后以并行的方式输出,这是最基本的串入并出的设计思想,这种对于串行接口

大行其道的告诉数据传输领域,这种简单的转换也是接口芯片重要的任务之一。但从FPGA系统设计的角度来看,串/并转换又有着更深刻的意义。从速度与面积互换的思想的角度来看,利用 n 倍的面积换取了 n 倍的吞吐量 ,这也是串并转换思想的重要体现。

                                                                                                                                                  -------------------------------------------以上摘自 吴厚航《深入浅出玩转fpga》

      下面是我写的一个利用8位移位寄存器构成的 8位串并转换,串行输入每经过8个时钟之后输出一次 8位的数据 ,shift_reg为移位寄存器,rst_n为低电平异步置零信号。

 

code:

.module seri_to_para(clk,data_in,rst_n,data_out,count,shift_reg
    );
input             clk,data_in,rst_n;
output  reg [7:0] data_out;   
output  reg [7:0] shift_reg;
output  reg [2:0] count;

always @ ( posedge clk or negedge rst_n )
  begin
      if (!rst_n)
       begin
         shift_reg <= 0;    
     end
    else       
         shift_reg <= {data_in,shift_reg[7:1]};                    
  end
 


always @ ( posedge clk or negedge rst_n)
begin
     if ( !rst_n )
      begin
       count <= 0;
    end
     else if( count < 7 )
           count <= count+1;
   else
       begin
       count <= 0;
     data_out <= shift_reg;
   end
end

endmodule

 

 testbench:

`timescale 1ns / 1ps

module testbench;

 // Inputs
 reg clk;
 reg data_in;
 reg rst_n;

 // Outputs
 wire [7:0] data_out;
 wire [7:0] shift_reg;
 wire [2:0] count;

 // Instantiate the Unit Under Test (UUT)
 seri_to_para uut (
  .clk(clk),
  .data_in(data_in),
  .rst_n(rst_n),
  .data_out(data_out),
  .shift_reg(shift_reg),
  .count(count)
 );

 initial begin
  // Initialize Inputs
  clk = 0;
  data_in = 1;
  rst_n = 1;

  // Wait 100 ns for global reset to finish
  #100;
  rst_n = 0;
  #33
  rst_n = 1;
       
  // Add stimulus here
    

 end
    always # 10 clk=~clk;
  always # 140 data_in=~data_in;
     
endmodule

 

仿真结果:

                                           

原创粉丝点击