关于verilog不能处理数组端口的解决方法

Verilog语言目前并不支持数组型端口,这不利于一些信号的管理。虽然System Veilog支持这样的定义,但是如果是芯片开发,就不得不用Verilog开发了。


即在Verilog中,不支持如下的端口定义:

复制代码
module divider_common#
(
     parameter                                  CHAN_NUM                  = 8    // 通道数
    ,parameter                                  CHAN_DW                   = 8    // 数据位宽
)
(
     input                                      sys_clk
    ,input                                      sys_rst
    
    ...
    
    ,input                                      i_dat_vld      [0:CHAN_NUM-1]
    ,input  [CHAN_DW-1:0]                       i_dat          [0:CHAN_NUM-1]

    ...

    ,output                                     o_dat_vld      [0:CHAN_NUM-1]
    ,output [CHAN_DW-1:0]                       o_dat          [0:CHAN_NUM-1]
);

针对上述情况,更改端口定义方式:即从数组定义 方式变为大位宽定义

复制代码
module divider_common#
(
     parameter                                  CHAN_NUM                  = 8    // 通道数
    ,parameter                                  CHAN_DW                   = 8    // 数据位宽
)
(
     input                                      sys_clk
    ,input                                      sys_rst
    
    ...
    
    ,input  [CHAN_NUM-1:0]                      i_dat_vld
    ,input  [CHAN_NUM*CHAN_DW-1:0]              i_dat

    ...

    ,output [CHAN_NUM-1:0]                      o_dat_vld
    ,output [CHAN_NUM*CHAN_DW-1:0]              o_dat
);

为了在模块内部更方便的使用(例如generate for 或者 generate if),可以在模块内部将大位宽数据拆分为数组。如下:

对于input端口

复制代码
    genvar i;
    
    wire                             data_in_vld      [0:CHAN_NUM-1]  ;
    wire  [CHAN_DW-1:0]              data_in          [0:CHAN_NUM-1]  ;

    // input 大位宽转数组
    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            assign data_in_vld[i] = i_dat_vld[i*1 +: 1];
            assign data_in[i] = i_dat[i*CHAN_DW +: CHAN_DW];
        end
    endgenerate

对于output端口

复制代码
    genvar i;
    
    reg                             data_out_vld      [0:CHAN_NUM-1]  ;
    reg  [CHAN_DW-1:0]              data_out          [0:CHAN_NUM-1]  ;

    // input 大位宽转数组
    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            assign o_dat_vld[i*1 +: 1] = data_out_vld[i];
            assign o_dat[i*CHAN_DW +: CHAN_DW] = data_out[i];
        end
    endgenerate

    ...

    generate
        for (i = 0; i < CHAN_NUM; i = i + 1) begin
            always@ (posedge sys_clk) begin
                data_out_vld[i] <= ...;
                data_out <= ...;
            end
        end
    endgenerate
相关推荐
珞光电子USRP SDR软件无线电平台5 小时前
打破通用瓶颈:珞光电子发布 Luowave Driver V2 定制化驱动方案
fpga开发
9527华安5 小时前
FPGA实现PCIe数据通信培训课程,提供工程源码+视频教程+FPGA开发板
fpga开发·pcie·视频教程·培训
my_daling5 小时前
FPGA实现IIC主机读写,以及部分IIC传感器控制流程
fpga开发
乌恩大侠6 小时前
【AI-RAN】在空ubuntu服务器安装环境和生成TV,高达430G文件
服务器·人工智能·ubuntu·fpga开发·o-ru
qq_150841998 小时前
高云FPGA固件下载速成
fpga开发
一个平凡而乐于分享的小比特8 小时前
一文读懂MCU与FPGA:核心区别、协同之道与双修秘籍
单片机·fpga开发·职场发展·mcu开发
LCMICRO-1331084774611 小时前
长芯微LD1871完全P2P替代AD1871,是一款立体声音频ADC
单片机·嵌入式硬件·fpga开发·音视频·硬件工程·dsp开发·音频adc
木心术112 小时前
AI在FPGA中实现多平台射频信号时隙调整参考及案例
人工智能·fpga开发·信息与通信
LCMICRO-1331084774612 小时前
长芯微LD73360完全P2P替代AD73360,是一款工业电能计量6通道模拟输入前端(AFE) 处理器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模拟前端afe
zjxtxdy1 天前
STM32开发
stm32·单片机·fpga开发