【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法

这篇具有很好参考价值的文章主要介绍了【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文参考:verilog generate语法总结-CSDN博客

Verilog数组赋值_笔记大全_设计学院

for 的用法

在Verilog中,generate forfor都是用于循环的结构,但是它们具有不同的应用场合和语义。

for循环:

for循环主要用于行为描述(behavioral description),通常用于描述算法或数学运算。

for循环在仿真时执行,因此,任何在for循环中使用的变量都必须是仿真时间可访问的。

for循环通常在初始化代码或在行为模型中使用,不适用于综合。示例:

在testbanch中测试使用的for代码

module test;  
    reg [7:0] vector[0:7];  
    integer i;  
    initial begin  
        for (i = 0; i < 8; i = i + 1) begin  
            vector[i] = i;  
        end  
    end  
endmodule

generate for的用法

generate for循环:

generate for循环用于结构描述(structural description),用于实例化模块或生成多个类似的结构。

generate for循环在编译时执行,生成的实例在编译后的网表中可见。

generate for循环可用于综合和实现。示例:

实现批量例化的generate for 代码

module test;  
    genvar i;  
    generate  
        for (i = 0; i < 8; i = i + 1) begin : gen_block  
            my_module instance (.input(input[i]), .output(output[i]));  
        end  
    endgenerate  
endmodule

在这个例子中,my_module被实例化了8次,每次实例化都与不同的输入和输出相连接。genvar关键字用于声明在generate for循环中使用的变量。

总结区别

主要区别在于for循环用于行为描述,在仿真时执行;

generate for循环用于结构描述,在编译时执行。此外,它们的变量类型也不同,for循环使用integer类型,而generate for循环使用genvar类型。

使用genrate for后面跟的 begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。

补充

正常情况下,我们的for循环、if以及case语句都要写在always块中,

然而在always块里是不能例化模块的,

所以我们就没有办法使用这几种语句去例化模块。

可是使用了generate之后,我们就可以不在always块中使用for循环、if以及case语句,

从而可以使用这几种语句来例化模块,这样我们就可以方便的给不同的例化对象不同的参数以及实现在不同情况下例化不同模块的需求。

数组的用法

一、数组基础

reg [7:0] my_array [0:3];

表示数组元素个数有4个,每一个元素是8位

注意my_array 前后的写法 前面的位数是7:0 ,后面的个数是0:3

二、数组赋值

1. 声明时初始化

reg [7:0] my_array [0:3] = '{8'h11, 8'h22, 8'h33, 8'h44};

2. 按索引赋值

my_array[1] = 8'hAA;

3. 循环赋值

   integer i;
    always @(*) begin
        for (i=0; i<4; i=i+1) begin
            my_array[i] = i+1;
        end
    end

可以使用循环语句在always块中为数组元素进行赋值。在上面的例子中,我们使用了一个for循环来遍历数组索引,并将其值设置为在循环中计算的值。

问题:'Port' must not be declared to be an array:

【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法,verilog &amp;FPGA,fpga开发,学习

【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法,verilog &amp;FPGA,fpga开发,学习

端口不能定义成数组格式

修改:

【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法,verilog &amp;FPGA,fpga开发,学习

示例:使用generate for 实现例化4个脉冲计数功能

需求

1,使用generate for 实现例化4个脉冲计数功能

需求分析

1,熟悉generate for 语句的用法

2,端口定义,注意端口不能出现数组的写法,需列出全部接口。但wire/reg 可使用数组的写法。

可以在generate for 例化中使用wire 类型的信号数组

最后使用assign 端口 = wire 的形式

3,数组的用法,注意 [位:0]name [0:个] name前后的 写法。

4,在testbanch 中for 的写法,区别于generate for。

5,rand = {random}%15 。random 的3种用法注意事项

vlg_design

/
/*
脉冲计数,当是能时,对pluse脉冲计数
实现步骤
1)产生pluse 上升沿脉冲 一个clk时钟
2)产生i_en 下降沿,当下降沿 o_state=1
3)对pluse上升沿计数,锁存在r_cnt
4)当o_state=1 时,o_cnt<=r_cnt
 
 */
/
`timescale 1ns/1ps
module vlg_design(
    input clk,//100M
    input pulse,// 
    input reset_n,
    input  i_en,  
    output reg[31:0] o_cnt,  //输出计数值
    output  o_state
    );
    

reg [1:0] r_pluse;
reg [1:0] r_en;
wire w_pluse_pos;
wire w_en_neg;
reg[31:0] r_cnt;

//产生一个pluse 上升沿脉冲时钟
 always @(posedge clk) begin
    if(!reset_n) r_pluse <='b00;
    else  r_pluse <= {r_pluse[0],pulse};
 end 
assign w_pluse_pos = r_pluse[0] & ~r_pluse[1];


//产生一个i_en 下降沿脉冲时钟
//en 下降沿时 o_state =1
 always @(posedge clk) begin
    if(!reset_n) r_en <='b00;
    else  r_en <= {r_en[0],i_en};
 end 
assign o_state = r_en[1] & ~r_en[0];

 


//EN = 1时候计数
 always @(posedge clk) begin
    if(!reset_n) r_cnt <= 'b0;
    else if(i_en)
            if(w_pluse_pos)r_cnt <= r_cnt + 1'b1;
            else ; 
         else  r_cnt <= 'b0;
end



//输出o_cnt
always @(posedge clk) begin
    if(!reset_n) o_cnt  <= 'b0;
    else if(!i_en && r_cnt)  begin
        o_cnt <= r_cnt;
        $display("r_cnt=%d\n",r_cnt);//显示
        end
    else o_cnt  <= 'b0;
end
 

endmodule

vlg_cnt4

/
//使用generate for 例化端口
//设计一个脉冲计数器,其功能如下
//输入脉冲:16路脉冲信号,分别对每路进行脉冲检测并计数
//使能信号:高电平进行计数,低电平清零计数器
//计数器:在使能信号高电平期间,对脉冲信号的上升沿进行检测并递增计数值
//编写测试脚本,进行仿真验证
/

`timescale 1ns/1ps
module vlg_cnt4(
    input clk, 
    input [3:0]pulse, 
    input reset_n,
    input  i_en,  
    output  [31:0]o_cnt_0,o_cnt_1,o_cnt_2,o_cnt_3,
    output  [3:0]o_state    
    );
//定义32位的w_cnt 数组,数组元素个数4
wire [31:0]w_cnt[0:3];

//使用 generate for 例化端口
genvar i;  
    generate  
        for (i = 0; i < 4; i = i + 1) begin : gen_block  
            vlg_design uut_vlg_design (
            .clk(clk), 
            .pulse(pulse[i]),
            .reset_n(reset_n),
            .i_en(i_en),
            .o_cnt(w_cnt[i]),
            .o_state(o_state[i])            
            );  
        end  
    endgenerate  
//端口赋值
assign     o_cnt_0 =w_cnt[0];
assign     o_cnt_1 =w_cnt[1];
assign     o_cnt_2 =w_cnt[2];
assign     o_cnt_3 =w_cnt[3];    
    
endmodule

testbench_top

`timescale 1ns/1ps
module testbench_top();
    

//参数定义
`define CLK_PERIORD        10        //时钟周期设置为10ns(100MHz)    


//接口申明
reg clk;
reg [3:0]pulse;
reg reset_n;
reg i_en;
wire[31:0]o_cnt_0;
wire[31:0]o_cnt_1;
wire[31:0]o_cnt_2;
wire[31:0]o_cnt_3;
wire [3:0]o_state;
    
vlg_cnt4        uut_vlg_cnt4(
    .clk(clk),
    .pulse(pulse),
    .reset_n(reset_n),
    .i_en(i_en),
    .o_cnt_0(o_cnt_0),
    .o_cnt_1(o_cnt_1),    
    .o_cnt_2(o_cnt_2),    
    .o_cnt_3(o_cnt_3),
    .o_state(o_state)
    );    
    
//时钟和复位初始化、复位产生 
initial begin
clk <= 0;
reset_n <= 0;
#10;
reset_n <= 1;
clk <= 1;
pulse <= 'b0000;   //初始化都为0
i_en <= 0;
end

//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;    
integer i;
 
 
//测试激励产生
initial begin
@(posedge reset_n);    //等待复位完成
@(posedge clk);

 //生成一个4位的0~15的随机数,赋值给pluse
i_en <= 1;
@(posedge clk);
//10次循环,给4个pluse赋值
for(i = 0;i < 10;i = i+1) begin
        pulse  <=  {$random} % 15;
        repeat(3)@(posedge clk);
end

pulse <= 'b0000; 
i_en <= 0;
#2_000_000;
$stop;
end
endmodule

仿真结果

【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法,verilog &amp;FPGA,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-769022.html

到了这里,关于【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

    用查找表设计实现一个正弦波形发生器 寻址的位宽是10位,数据量是1024个,输出的数据是16位 数据量是1024个: x = linspace(0,2*pi,1024) 输出数据是16位: y范围:0~2^16 -1 = 0~65535 y =( sin(x)+1)*65535/2 寻址的位宽是10位 输入是0~1023 1023 占用10位 操作步骤 1,使用matlab 生成数据,制作

    2024年02月05日
    浏览(47)
  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(43)
  • 【FPGA】Verilog设计入门——时序模块及其Verilog表述

    目录 1.边沿触发型触发器及其Verilog表述 2.电平触发型锁存器及其Verilog表述  3.含异步复位/时钟使能型触发器及其Verilog表述 4.同步复位型触发器及其Verilog表述  5.异步复位型锁存器及其Verilog表述 6.Verilog的时钟过程表述的特点和规律   7.异步时序模块的Verilog表述  8.4位二进制

    2024年02月07日
    浏览(31)
  • verilog中的for 循环

    例1. 令x=3,仿真结果 综合结果: for循环n次代表有n个相似的电路模块存在;代码上的“循环反馈”结构在阻塞赋值时代表前后有关联 综合结果既不是一个加法器循环三次(C语言),也不是三个并联的加法器(generate for),而是三个加法器串联 注: input [7:0] n Error (10119): Verilog HD

    2023年04月10日
    浏览(28)
  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(39)
  • verilog中的3种for循环的写法

    直接进入正题,对于for循环的三种循环做以下介绍: for循环用于例化多个模块 注意点: (1)例化模块在for循环内部 (2)for循环需加名字 (3)genvar 定义在generate外面,可以全局使用(不推荐使用,最好一个generate for,对应一个循环变量) for循环写多个always块或者写多个

    2023年04月11日
    浏览(30)
  • FPGA中的流水线设计(含Verilog范例)

    在高速通信系统设计中,如何提高系统的工作速度至关重要,通常使用的方法有两种: 1. 并行方式设计:可减少模块间的延时; 2. 流水线设计:流水线设计如同生产线一样,将整个执行过程分解为若干个工作段,从流水线的起点连续输入,各操作段以重叠方式执行。使得运

    2023年04月21日
    浏览(23)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(31)
  • 【数字IC/FPGA】Verilog中的force和release

    在Verilog中,将 force 用于variable会覆盖掉 过程赋值 ,或者assign引导的 连续(procedural assign)赋值 ,直到 release 。 下面通过一个简单的例子展示其用法: 加法器代码 测试平台代码(主要用于产生激励) 如上所示,正常情况下,u_adder模块的a和b端口由testbench中的a和b信号驱动,

    2024年02月09日
    浏览(33)
  • Verilog force语句详解:FPGA中的信号强制赋值

    Verilog force语句详解:FPGA中的信号强制赋值 在FPGA开发中,时序分析和调试是非常重要的一部分。其中,对于一些信号的调试,我们需要准确地模拟不同的情况来检测其工作状态。这时,Verilog force语句就起到了重要的作用。 force语句可以使信号立即进行强制赋值操作,在仿真

    2024年02月06日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包