当前位置: 首页 > article >正文

Verilog语法之generate与genvar用法

摘要:本文主要讲解了generate与genvar的用法,并且给出了详细的一些例子和用法,可以通过阅读本文基本了解其用法和规则。

        generate语法可以实现某些语句的重复。genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句,分支语句等做一些有规律地例化或者赋值等操作;对于提高简洁代码很有帮助,同时也减少了人为的影响。

        generate语法有generate for、generate if和generate case这3种。可以在generate中时钟的语法语句包括module(模块)、UDP(用户自定义原语)、门级原语、连续赋值语句、always语句和initial语句等。使用generate时,需要定义genvar作为generate的循环变量。其语法结构如下:

        接下来将提供3个示例代码来体会如何使用genvar以及generate。

示例代码1:

module vlg_design(
    input i_clk,
    input i_rst_n,
    input i_data,
    output o_data
);

    parameter DATA_SIZE=8;
    reg [DATA_SIZE-1:0] r_data;

    always @(posedge clk) begin
        r_data[0] <= i_data;
    end
    assign o_data = r_data[DATA_SIZE-1];

    genvar i;
    generate
        for(i=1; i<DATA_SIZE; i=i+1) begin
            always @(posedge i_clk) begin
                if(!i_rst_n) r_data[i] <= 1'b0;
                else r_data[i] <= r_data[i-1];
            end
        end
    endgenerate
endmodule

示例代码2:

module vlg_design #(parameter integer DATA_SIZE=8)
(    input i_clk,
     input i_en,
     output reg o_vld,
     input [DATA_SIZE-1:0] i_gray_code,
     output reg [DATA_SIZE-1:0] o_bin_data
);

always @(posedge i_clk) begin
    o_vld <= i_en;
end

genvar i;
generate 
    for(i=0; i<DATA_SIZE; i=i+1) begin
        always @(posedge i_clk) begin
            if(i_en) o_bin_data[i] <= ^i_gray_code[DATA_SIZE-1:i];
            else o_bin_data[i] <= 'b0;
        end
    end
endgenerate
endmodule

示例代码3:

module pulse_counter(
    input i_clk,
    input i_rst_n,
    input i_pulse,
    input i_en,
    output reg[15:0] o_pulse_cnt
);

reg [1:0] r_pulse;
wire w_rise_edge;

always @(posedge i_clk) begin
    if(!i_rst_n) r_pulse <= 2'b00;
    else r_pulse <= {r_pulse[0] , i_pulse};
end

assign w_rise_edge = r_pulse[0] & ~r_pulse[1];

always @(posedge i_clk) begin
    if(i_en) begin
        if(w_rise_edge) o_pulse_cnt <= o_pulse_cnt;
        else o_pulse_cnt <= o_pulse_cnt;
    end
    else o_pulse_cnt <= 'b0;
end
endmodule

module vlg_design(
    input i_clk,
    input i_rst_n,
    input [15:0] i_pulse,
    input i_en,
    output [15:0] o_pulse_cnt0,
    output [15:0] o_pulse_cnt1,
    output [15:0] o_pulse_cnt2,
    output [15:0] o_pulse_cnt3,
    output [15:0] o_pulse_cnt4,
    output [15:0] o_pulse_cnt5,
    output [15:0] o_pulse_cnt6,
    output [15:0] o_pulse_cnt7,
    output [15:0] o_pulse_cnt8,
    output [15:0] o_pulse_cnt9,
    output [15:0] o_pulse_cnta,
    output [15:0] o_pulse_cntb,
    output [15:0] o_pulse_cntc,
    output [15:0] o_pulse_cntd,
    output [15:0] o_pulse_cnte,
    output [15:0] o_pulse_cntf
);

wire [15:0] r_pulse_cnt [15:0];
genvar i;
generate
    for(i=0; i<16; i=i+1) begin
        pulse_counter uut1_pulse_counter(
            .i_clk(i_clk),
            .i_rst_n(i_rst_n),
            .i_pulse(i_pulse[i]),
            .i_en(i_en),
            .o_pulse_cnt(r_pulse_cnt[i])
        );
    end
endgenerate

assign o_pulse_cnt0=r_pulse_cnt[0];
assign o_pulse_cnt1=r_pulse_cnt[1];
assign o_pulse_cnt2=r_pulse_cnt[2];
assign o_pulse_cnt3=r_pulse_cnt[3];
assign o_pulse_cnt4=r_pulse_cnt[4];
assign o_pulse_cnt5=r_pulse_cnt[5];
assign o_pulse_cnt6=r_pulse_cnt[6];
assign o_pulse_cnt7=r_pulse_cnt[7];
assign o_pulse_cnt8=r_pulse_cnt[8];
assign o_pulse_cnt9=r_pulse_cnt[9];
assign o_pulse_cnta=r_pulse_cnt[a];
assign o_pulse_cntb=r_pulse_cnt[b];
assign o_pulse_cntc=r_pulse_cnt[c];
assign o_pulse_cntd=r_pulse_cnt[d];
assign o_pulse_cnte=r_pulse_cnt[e];
assign o_pulse_cntf=r_pulse_cnt[f];

endmodule

End!


http://www.kler.cn/a/467059.html

相关文章:

  • maven 打包时优先选择本地仓库
  • 小程序学习06——uniapp组件常规引入和easycom引入语法
  • VSCode设置ctrl或alt+mouse(left)跳转
  • 计算机毕业设计Python+Spark中药推荐系统 中药识别系统 中药数据分析 中药大数据 中药可视化 中药爬虫 中药大数据 大数据毕业设计 大
  • 网络攻击原理与常用方法
  • 启航数据结构算法之雅舟,悠游C++智慧之旅——线性艺术:顺序表之细腻探索
  • 仿生的群体智能算法总结之三(十种)
  • 【数据结构-单调队列】力扣1438. 绝对差不超过限制的最长连续子数组
  • 链表算法练习
  • Arduino Uno简介与使用方法
  • 如何逐步操作vCenter修改DNS服务器?
  • React 中的受控组件与非受控组件:深度剖析与实战应用
  • 微服务拆分的艺术:构建高效、灵活的系统架构
  • 清华发布Hyper-YOLO:超图计算+目标检测!捕捉高阶视觉关联
  • spring默认线程池SimpleAsyncTaskExecutor特点为什么要尽量避免使用
  • Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试
  • Nginx:日志管理
  • 零基础WPF使用NLog记录日志
  • CPU与GPU的区别
  • C/C++中 <<与<<=的介绍和区别