原语:串并转换器

串并转换器OSERDESE2

        可被Select IO IP核调用。 

IP配置方法:(待续)

        OSERDESE2允许DDR功能

参考:

FPGA原语学习与整理第二弹,OSERDESE2串并转换器 - 知乎 (zhihu.com)

正点原子。

        ISERDESE2原语和OSERDESE2原语是串并转换器,他的的功能都是实现串行数据和并行数据之间的转换。

        OSERDESE2原语将并行数据转换为串行数据,减少数据传输端口数量的同时也提高了频率,将低速数据转换为高速数据,方便传输。

        ISERDESE2原语是将串行数据转换为并行数据,将高速信号转换为低速数据,方便处理。和前面一样,赛灵思官方也给我们提供出来了相应的IP核SelectIO InterfaceWizard,对这些原语进行了封装,提供图形化界面方便使用,我们可以从这些IP来认识这些原语。

        OSERDESE2原语包含两个部分,一部分是数据3态控制器,一部分是串并数据转换控制器。

        因此我们可以把它们端口分成三大类,一部分是关于三态控制,一部分是关于时钟复位信号,一部分串并数据转换输入输出。在时钟复位信号中,CLK是串行数据时钟,是高速时钟,CLKDIV是并行数据时钟,是低速时钟。在串并数据转换输入输出部分中,D1~D8是并行数据输入,

        一个OSERDESE2最高支持8:1串并转换,想要达到更高速率转换,必须采用级联两个OSERDESE2的方式,这个后面重点讲述。OQ是串行数据输出端口。OFB也是输出端口,但是他有特殊的作用,一个是与ISERDESE2上的OFB引脚相连,作为反馈端口,一个是与ODELAYE2相连,作延迟输出使用,这个端口在正常使用过程一般悬空即可。OCE是高速时钟CLK的使能信号,可以一直置高电平,保证高速时钟一直使能。

两个OSERDESE2的串联方法

         DDR模式下,两个OSERDESE2原语串联方式,其中并行输入数据高2位会传入OSERDESE2原语(slave)D3-D4引脚,而OSERDESE2原语(slave)的SHIFTOUT1和SHIFTOUT2会连到OSERDESE2原语(Master)的SHIFTIN1和SHIFTIN2。

例程:代码来自正点原子 

 

        DATA_RATE_OQ是定义串行数据是以DDR的方式传输还是以SDR的方式传输,        

        DATA_WIDTH是定义并行数据的位宽,

        SERDES_MODE是在当需要两个OSERDESE2级联时,可以用于辨识那个是MASTER,那个是SLAVE。

        而DATA_RATE_TQ,TRISTATE_WIDTH是关于三态控制的,我们可以不用管。最后两个也是我们大多数情况下用不到的,默认FALSE就好。 

//例化OSERDESE2原语,实现并串转换,Master模式
OSERDESE2 #(
    .DATA_RATE_OQ   ("DDR"),       // 设置双倍数据速率
    .DATA_RATE_TQ   ("SDR"),       // DDR, BUF, SDR
    .DATA_WIDTH     (10),           // 输入的并行数据宽度为10bit
    .SERDES_MODE    ("MASTER"),    // 设置为Master,用于10bit宽度扩展
    .TBYTE_CTL      ("FALSE"),     // Enable tristate byte operation (FALSE, TRUE)
    .TBYTE_SRC      ("FALSE"),     // Tristate byte source (FALSE, TRUE)
    .TRISTATE_WIDTH (1)             // 3-state converter width (1,4)
)
OSERDESE2_Master (
    .CLK        (serial_clk_5x),    // 串行数据时钟,5倍时钟频率
    .CLKDIV     (paralell_clk),     // 并行数据时钟
    .RST        (reset),            // 1-bit input: Reset
    .OCE        (1'b1),             // 1-bit input: Output data clock enable
    
    .OQ         (serial_data_out),  // 串行输出数据
    
    .D1         (paralell_data[0]), // D1 - D8: 并行数据输入
    .D2         (paralell_data[1]),
    .D3         (paralell_data[2]),
    .D4         (paralell_data[3]),
    .D5         (paralell_data[4]),
    .D6         (paralell_data[5]),
    .D7         (paralell_data[6]),
    .D8         (paralell_data[7]),
   
    .SHIFTIN1   (cascade1),         // SHIFTIN1 用于位宽扩展
    .SHIFTIN2   (cascade2),         // SHIFTIN2
    .SHIFTOUT1  (),                 // SHIFTOUT1: 用于位宽扩展
    .SHIFTOUT2  (),                 // SHIFTOUT2
        
    .OFB        (),                 // 以下是未使用信号
    .T1         (1'b0),             
    .T2         (1'b0),
    .T3         (1'b0),
    .T4         (1'b0),
    .TBYTEIN    (1'b0),             
    .TCE        (1'b0),             
    .TBYTEOUT   (),                 
    .TFB        (),                 
    .TQ         ()                  
);
   
//例化OSERDESE2原语,实现并串转换,Slave模式
OSERDESE2 #(
    .DATA_RATE_OQ   ("DDR"),       // 设置双倍数据速率
    .DATA_RATE_TQ   ("SDR"),       // DDR, BUF, SDR
    .DATA_WIDTH     (10),           // 输入的并行数据宽度为10bit
    .SERDES_MODE    ("SLAVE"),     // 设置为Slave,用于10bit宽度扩展
    .TBYTE_CTL      ("FALSE"),     // Enable tristate byte operation (FALSE, TRUE)
    .TBYTE_SRC      ("FALSE"),     // Tristate byte source (FALSE, TRUE)
    .TRISTATE_WIDTH (1)             // 3-state converter width (1,4)
)
OSERDESE2_Slave (
    .CLK        (serial_clk_5x),    // 串行数据时钟,5倍时钟频率
    .CLKDIV     (paralell_clk),     // 并行数据时钟
    .RST        (reset),            // 1-bit input: Reset
    .OCE        (1'b1),             // 1-bit input: Output data clock enable
    
    .OQ         (),                 // 串行输出数据
    
    .D1         (1'b0),             // D1 - D8: 并行数据输入
    .D2         (1'b0),
    .D3         (paralell_data[8]),
    .D4         (paralell_data[9]),
    .D5         (1'b0),
    .D6         (1'b0),
    .D7         (1'b0),
    .D8         (1'b0),
   
    .SHIFTIN1   (),                 // SHIFTIN1 用于位宽扩展
    .SHIFTIN2   (),                 // SHIFTIN2
    .SHIFTOUT1  (cascade1),         // SHIFTOUT1: 用于位宽扩展
    .SHIFTOUT2  (cascade2),         // SHIFTOUT2
        
    .OFB        (),                 // 以下是未使用信号
    .T1         (1'b0),             
    .T2         (1'b0),
    .T3         (1'b0),
    .T4         (1'b0),
    .TBYTEIN    (1'b0),             
    .TCE        (1'b0),             
    .TBYTEOUT   (),                 
    .TFB        (),                 
    .TQ         ()                  
);  

并串转换器ISERDES

例程来自Select IO ip内部 

(LVDS差分信号简单处理)4. 使用ISERDES接收高速串行数据 - 知乎 (zhihu.com)

     ISERDESE2
       # (
         .DATA_RATE         ("DDR"),
         .DATA_WIDTH        (8),
         .INTERFACE_TYPE    ("NETWORKING"), 
         .DYN_CLKDIV_INV_EN ("FALSE"),
         .DYN_CLK_INV_EN    ("FALSE"),
         .NUM_CE            (2),
         .OFB_USED          ("FALSE"),
         .IOBDELAY          ("NONE"),                               // Use input at D to output the data on Q
         .SERDES_MODE       ("MASTER"))
       iserdese2_master_lane0 (
         .Q1                ( iserdes_q [0][7] ),
         .Q2                ( iserdes_q [0][6] ),
         .Q3                ( iserdes_q [0][5] ),
         .Q4                ( iserdes_q [0][4] ),
         .Q5                ( iserdes_q [0][3] ),
         .Q6                ( iserdes_q [0][2] ),
         .Q7                ( iserdes_q [0][1] ),
         .Q8                ( iserdes_q [0][0] ),
         .SHIFTOUT1         ( ),
         .SHIFTOUT2         ( ),
         .BITSLIP           ( Bitslip[0]),                  // 1-bit Invoke Bitslip. This can be used with any DATA_WIDTH, cascaded or not.
                                                            // The amount of BITSLIP is fixed by the DATA_WIDTH selection.
         .CE1               ( clock_enable   ),             // 1-bit Clock enable input
         .CE2               ( clock_enable   ),             // 1-bit Clock enable input
         .CLK               ( Buff_Clk       ),             // Fast source synchronous clock driven by BUFIO
         .CLKB              ( Buff_Clk_inv   ),             // Locally inverted fast 
         .CLKDIV            ( Bufd_Slow_Clk  ),             // Slow clock from BUFR.
         .CLKDIVP           ( 1'b0    ),
         .D                 ( Mipi_IBUFD_Data_delay[0]),    // 1-bit Input signal from IOB 
         .DDLY              ( 1'b0   ),                     // 1-bit Input from Input Delay component 
         .RST               ( !Rst_n ),                     // 1-bit Asynchronous reset only.
         .SHIFTIN1          ( 1'b0   ),
         .SHIFTIN2          ( 1'b0   ),
    // unused connections 
         .DYNCLKDIVSEL      ( 1'b0 ),
         .DYNCLKSEL         ( 1'b0 ),
         .OFB               ( 1'b0 ),
         .OCLK              ( 1'b0 ),
         .OCLKB             ( 1'b0 ),
         .O                 ( ));                                   // unregistered output of ISERDESE1
   

 IP配置方法:(待续)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cycbuffer原语是一种在FPGA设计中常用的原语,用于实现循环缓冲区。它可以用于存储和处理连续的数据流,并提供了一种有效的方式来处理数据的循环读写。cycbuffer原语通常由FPGA厂商提供,并且可以在设计中直接使用。 cycbuffer原语具有多个输入和输出端口,包括数据输入端口、数据输出端口、读指针输入端口、写指针输入端口和控制信号端口。通过控制信号,可以实现对循环缓冲区的读写操作。 以下是一个使用cycbuffer原语实现循环缓冲区的示例代码: ```verilog module cycbuffer ( input wire clk, input wire reset, input wire enable, input wire [DATA_WIDTH-1:0] data_in, input wire write_enable, input wire read_enable, input wire [ADDR_WIDTH-1:0] write_addr, input wire [ADDR_WIDTH-1:0] read_addr, output wire [DATA_WIDTH-1:0] data_out ); reg [DATA_WIDTH-1:0] buffer [0:DEPTH-1]; reg [ADDR_WIDTH-1:0] write_ptr; reg [ADDR_WIDTH-1:0] read_ptr; always @(posedge clk or posedge reset) begin if (reset) begin write_ptr <= 0; read_ptr <= 0; end else if (enable) begin if (write_enable) begin buffer[write_addr] <= data_in; write_ptr <= write_ptr + 1; end if (read_enable) begin data_out <= buffer[read_addr]; read_ptr <= read_ptr + 1; end end end endmodule ``` 在这个示例中,cycbuffer原语被定义为一个Verilog模块。它包含了一个深度为DEPTH的循环缓冲区,每个位置可以存储DATA_WIDTH位的数据。通过write_enable和read_enable信号,可以控制写入和读取操作。写入操作通过write_addr指定写入位置,读取操作通过read_addr指定读取位置。数据输入通过data_in端口,数据输出通过data_out端口。 使用cycbuffer原语可以方便地实现循环缓冲区,用于存储和处理连续的数据流。它在FPGA设计中具有广泛的应用,特别适用于需要处理大量数据的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值