verilog中的循环语句以及generate

verilog中的循环语句以及generate

  • verilog中的循环语句
    • for语句
    • while语句
    • repeat语句
    • foever 语句
    • generate语句
  • 实际应用
    • 计数器结构RTL结构如图
    • for语句RTL结果
    • generate语句RTL结构
    • 仿真code

verilog中的循环语句

verilog中的循环语句主要有,for,while,repeat,foever.generate就显的另类了。博主针对这几个语句进行介绍,并以for,以及generate写一个测试程序分别看RTL电路结构的不同。

for语句

for语句的结构如下

for(表达式1;表达式2;表达式3)

for语句与C语言中的结构一样,接触过C语言的人很容易理解,通常用for语句初始化memory。
for语句中的循环变量可以示integer也可以是reg类型

while语句

while循环结构如下

while(循环执行条件表达式) begin
语句块;
end

在执行while语句时首先判断循环条件表达式如果条件为真则执行循环。否者不执行。
下面是一个while循环例子

begin:  count
    reg[7:0] data_in;
    count=0;
    data_in= rega;
    while(data_in)
    begin
        if(data_in[0]) count = count + 1;
 
        data_in = data_in>>1;
    end
end

repeat语句

repeat语句结构如下

repeat(循环次数表达式) begin
语句块;
end

repeat循环的次数由循环表达式决定。

foever 语句

foever语句与前面三个不同,前面三个循环语句可以综合,但repeat语句不可综合,通常用在激励文件中,博主通常用该语句产生时钟,例如产生一个50MHZ的时钟。

clk=0;
foever #10 clk=~clk;

generate语句

generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always语句、initial语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。
generate语法
定义genvar,作为generate种的循环变量。
generate语句中定义的for语句,必须要有begin,为后续增加标签做准备。
begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。
可以使用在generate语句中的类型主要有:

  • ü module(模块)
  • ü UDP(用户自定义原语)
  • ü 门级原语
  • ü 连续赋值语句
  • ü initial或always语句
    基本结构如下:
    genvar 循环变量名;
    generate
    // generate循环语句
    // generate 条件语句
    // generate 分支语句
    // 嵌套的generate语句
    endgenerate

实际应用

在实际应用,三种可综合的循环语句是可以互换的,但在实际应用中要谨慎使用循环。虽然循环语句可以简化代码,益读。但在FPGA内部并没有循环结构,FPGA能做的就是将循环结构展开,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。简单的说就是:f语句循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。因此在实际应用中通常产生一个计数器来代替循环结构。避免资源的浪费。

计数器结构RTL结构如图

verilog中的循环语句以及generate_第1张图片

for语句RTL结果

verilog中的循环语句以及generate_第2张图片

generate语句RTL结构

verilog中的循环语句以及generate_第3张图片

仿真code

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: zhangsy
// 
// Create Date: 2019/08/31 09:48:23
// Design Name: 
// Module Name: test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module test(
                 input clk,rst,
                 input [12:0] data_in,
                output reg[15:0] data_out
           );
         reg [3:0] i;
   always @(posedge clk)
    if(rst)
    data_out <=0;
   else begin
    for(i=0;i<13;i=i+1)
          if(data_in[i])
          begin
              data_out = data_out+1'b1;
              
           end 
end
//reg [3:0] i;
/*genvar i;
generate
for(i=0;i<13;i=i+1)
begin:bit
 always @ (posedge clk)
 if(rst)
 begin
    data_out = 16'd0;
   end
  else begin
    
        if(data_in[i])
        begin
            data_out = data_out+1'b1;
            
         end
            end
   end         
 endgenerate    */    
/*reg [3:0] i;
always @(posedge clk)
    if(rst)
        i <= 0;
     else
        i <= i +1'b1;
//-----------------------------
always @ (posedge clk)
    if(rst)
        data_out <= 16'd0;
     else if(data_in[i])
        data_out <= data_out + 1'b1; */
 
endmodule

你可能感兴趣的:(verilog,FPGA)