首页 > 其他分享 >Verilog语法之generate与genvar用法

Verilog语法之generate与genvar用法

时间:2025-01-02 17:25:24浏览次数:7  
标签:语句 clk reg Verilog input genvar generate

摘要:本文主要讲解了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!

标签:语句,clk,reg,Verilog,input,genvar,generate
From: https://blog.csdn.net/qq_59846104/article/details/144890305

相关文章

  • verilog
    参考:Verilog语法-数字电路教程wire类型在每次赋值前要加assign,而reg类型在每次赋值前不需要加任何东西。在always块内被赋值的信号应定义成reg型,用assign语句赋值的信号应定义成wire型。操作符~按位取反、&按位与、|按位或。||逻辑或wire:在Verilog中,线网型信......
  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信
    1.算法运行效果图预览(完整程序运行后无水印) 输出方波   输出脉冲波 输出m随机序列   输出正弦波   2.算法运行软件版本vivado2019.2 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)//themoduleofjuxinsignalsignal_juxs......
  • code-generate(一个通用的代码生成工具)开源项目介绍
    code-generate是一个通用的代码生成工具,支持从各种元数据,通过定义模板生成需要的代码,减少低级重复的编码工作。目前支持通过数据库元数据生成业务对象、数据访问对象等。项目地址gitee:https://gitee.com/wei772/code-generategithub:https://github.com/wei772/code-genera......
  • CompilerGenerated与GeneratedCode区别
    前言最近在捣鼓代码生成器,基于Roslyn,我们可以让生成器项目生成我们的目标C#代码,这个也是MVVMToolkit的实现方式,在查看生成代码的过程中,我们经常会遇到一些特殊的特性,如GeneratedCodeAttribute,刚好我还遇到过CompilerGeneratedAttribute。感觉两个特性差不多,都可以用于标识......
  • 使用verilog生成各种CRC校验码
    一、功能介绍在FPGA进行各种接口通信时,经常会出现对方发来的数据带有CRC校验码,如CRC5、CRC8、CRC16、CRC32等,为了适应不同的情况,我们使用Verilog实现了一个比较通用的CRC计算模块,可生成CRC5/CRC8/CRC16/CRC32等各种宽度的CRC校验码,满足不同场景下的CRC校验需求。二、模块调用示......
  • 基于FPGA的数字电子秤设计(verilog)
    目录一、功能描述二、顶层设计分析2.1I2c_ctrl模块2.2PCF8591_ad模块 2.3v_weigh电压转质量模块2.4weighing_pre去皮模块2.5mcx计价模块2.6money价格输出模块2.7chose数码管选择显示模块2.8sign_give信号提供模块2.9buffer报警模块2.10顶层设计......
  • HDLBits-Verilog:Clock
    Youareprovidedamodulewiththefollowingdeclaration:moduledut(inputclk);Writeatestbenchthatcreatesoneinstanceofmoduledut(withanyinstancename),andcreateaclocksignaltodrivethemodule'sclkinput.Theclockhasaperi......
  • 【Verilog HDL】如何正确地进行移位操作?逻辑移位、算数移位
    【VerilogHDL】如何正确地进行移位操作?逻辑移位、算数移位为什么要移位操作移位操作逼近常数乘除法如何正确移位为什么要移位操作在FPGA中,数据的存储、逻辑运算、算数运算等都是以二进制的形式完成的,这就表明移位操作所需要的时间和占用的资源会非常少。举例:移......
  • 从代码解析Spotting LLMs With Binoculars: Zero-Shot Detection of Machine-Generate
    本文是对一篇ICML2024文章SpottingLLMsWithBinoculars:Zero-ShotDetectionofMachine-GeneratedText进行计算过程的讲解该文章主要提供了一种zero-shot的AIGC文本检测方法,在文章中所说,使用较少的计算量就起到了不错的效果主要计算过程如下图所示:perplexityperp......
  • 基于CPLD/FPGA的呼吸灯效果实现(附全部verilog源码)
    一、功能介绍此设计可以让你的FPGA板子上那颗LED具有呼吸效果,像智能手机上的呼吸灯一样。以下源码已上板验证通过,大家可直接使用。二、呼吸灯Verilog源码ps1.带★号处可根据需要进行修改.ps2.有需要的话可自行添加rst复位信号. /**************************************......