Verilog语法-模块module[Day2学习笔记]

这篇具有很好参考价值的文章主要介绍了Verilog语法-模块module[Day2学习笔记]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1概述

Verilog HDL是一种用于数字逻辑电路设计的硬件描述语言,可用来进行数字电路的仿真验证、时序分析、逻辑综合。

  • 用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。

  • Verilog HDL既是一种行为描述语言,也是一种结构描述语言。

  • 既可以用电路的功能描述,也可以用元器件及其之间的连接来建模。


2模块 Module

模块(module)是Verilog的基本单位,除了编译指令,其他所有的设计代码都必须放在一个或多个模块中。对模块的描述可以是任意的,可以是行为描述、数据流描述或结构描述。

格式:

module <模块名-对应功能>(
    input  <端口>,
    output <端口>
    );
...
<模块内容>
...
endmodule

一个模块内部可以使用其他模块,称为实例。上层模块可以引用底层人意层次模块的变量。

格式:

  1. 信号名关联法(多用)

<实例名rtl>  <第二层实例名>.(变量名-tb)  //.表示索引

b. 位置关联法

//信号名关联法
sort4 sort4_tb(
    .ra(ra),
    .rb(rb),
    .rc(rc),
    .rd(rd),
    .a(a),
    .b(b),
    .c(c),
    .d(d)
);
//位置关联法
sort4 sort4_tb_u(a,b,c,d,ra,rb,rc,rd);
verilog 顶层模块,Verilog,fpga开发,Powered by 金山文档

拿二选一举例,子模块为mux2to1,基本单元为u_mux2to1:

  1. 信号名关联法

mux2to1 u_mux2to1(
    .out(u_out),
    .a  (u_a),
    .b  (u_b),
    .sel(u_select)
    );
  1. 位置关联法

mux2to1 u_mux2to1(a,b,sel,out);

3模块总结

  1. Verilog HDL中的标识符可以是任意一组字母、数字、$和下划线_组合,区分大小写。但标识符的第一个字符必须是字母或下划线

  1. Verilog HDL是由模块组成,每个模块嵌套在module与endmodule声明语句之间。模块之间是可以进行层次嵌套的。

  1. 每个Verilog HDL源文件中,只准有一个顶层模块,其他为子模块。

  1. 每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑、数据流、结构描述。

  1. 除了endmodule、begin_end、fork_join语句外,每个语句和数据定义后必须有分号

  1. 可用/*...*/和//...进行注释。


4二选一模块举例

以二选一来举例,其电路图如下图所示,

verilog 顶层模块,Verilog,fpga开发,Powered by 金山文档

列举了3种方式,Type 1 是hdlbits中的原题,

//多路复用器
//---------------------------Type 1:---------------------------
/* Q:Create a one-bit wide, 2-to-1 multiplexer. 
     When sel=0, choose a. When sel=1, choose b. */
module top_module( 
    input   a, b, sel,
    output  out 
); 
    assign out = (sel) ? b : a ; //sel=1 ,out=b; sel=0, out=a;
    // ***** 信号 = 条件?表达式1:表达式2; *****
endmodule


// ---------------------------Type 2: Mux2to1---------------------------
//Choose one of the two channels of data as the output
module mux2to1(
    input    sel,    //select signial 1:b, 0:a   
    input    op_a,   //
    input    op_b,   //
    output   out     //
    );

reg out_t; //out_t为寄存器,为reg
assign out = out_t;

always @(*) begin   //*——组合逻辑(无触发器)
    if (sel) begin
        out_t = op_b;
    end
    else begin
        out_t = op_a;
    end
end
endmodule


// ---------------------------Type 3---------------------------
module mux2to1(
    input     a     ,
    input     b     ,
    input     s     ,
    output    out
    );
reg out;   //组合逻辑的reg,不是触发器,仅为组合逻辑的信号
           
always @(s or a or b)begin  //* = 敏感信号列表,表内信号变化,会触发always,执行一次列表(所有电平信号)
    if (!s) 
        out = a;
    else 
        out = b;
end
endmodule

5Verilog用于模块的测试

  1. 仿真是什么?为什么进行仿真?

仿真是对电路模块进行动态的全面测试。通过观测被测试信号的输出信号是否符合要求,可用调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。

  1. 仿真可以在几层面上进行?每个层面的仿真有什么意义?

仿真有:前(RTL)仿真、逻辑网表仿真、门级仿真和布线仿真

  • 前(RTL)仿真、逻辑网表仿真、门级仿真:可以调试和验证逻辑系统的设计和结构是否准确,并发现问题及时修改;

  • 布线后仿真:分析设计的电路模块的运行是否正常。

  1. 如何检查程序的功能是否正确?

  • 需要有测试激励信号输入到被测模块;

  • 需要记录被测模块的输出信号;

  • 需要把功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合);

  • 需要对已经转化为门级电路结构的逻辑进行测试(门级电路仿真);

  • 需要对布局布线后的电路结构进行测试(布局布线后仿真)。

在二选一中,

测试信号和测试激励的产生--ain\ bin\ select

被测试模块的测试信号的响应--out

对二选一进行测试:

//always, initial是并行的
// -------------------------1------------------------
module mux2to1_tb();
reg     a        ;  //rtl input
reg     b        ;  //rtl input
reg     select   ;  //rtl input
wire    outw     ;  //rtl output

mux2to1 mux2to1_inst(
    .op_a(a)        ,
    .op_b(b)        ,    
    .sel(select)    ,
    .out(outw)
    );

initial begin  //对输入赋0
    a       = 0 ;        
    b       = 0 ;
    select  = 0 ;
    clk     = 0 ;
end

initial begin  //产生时钟; 每延时5单位,给clk取反
    forever #5 clk = ~clk ; 
end
/* 产生时钟
always #5 clk =~ clk; 
*/

always begin   //always @(posedge clk)begin
    #10 a = {$random}%2 ;
    #5  b = {$random}%2 ;
end

always #20 select = ~select ;

initial begin
   #200 $stop ; 
end 

endmodule

// -------------------------2------------------------
`timescale 1ns/1ps //仿真时间单位/精度

module mux2to1_tb();

reg     ain, bin, select    ;
reg     clk                 ;
wire    outw                ;  //不写默认wire型 

initial begin //0时刻给初值0;initial--只执行一次 
    ain     =  0  ;
    bin     =  0  ;
    select  =  0  ;
    clk     =  0  ;
end 

always #10 clk = ~ clk;  // 产生一个时钟波形
/*
forever begin
    #10 clk = ~ clk ;
end
*/

always @(posedge clk)   // 产生ain, bin随机值
    begin
        #1 ain = ($random)%2 ;  //模2,0/1
        #3 bin = {$random}%2 ;  
    end
end

always #2 select = !select ; //选通信号

initial begin
    #200
    $finish();
end

//例化
mux2to1 mux2to1_inst(.out(outw),.a(ain),.b(bin),.s(select));

endmodule

Q. 若不用initial块,是否能产生测试时钟?

可以。产生测试时钟有两种:

//-----------第一种------------
initial begin              //产生时钟; 每延时5单位,给clk取反
    forever #5 clk = ~clk ; 
end
//-----------第二种------------
always #5 clk =~ clk;         //每延时5单位,给clk取反

以上均为本人学习笔记,若有错误请及时纠正。文章来源地址https://www.toymoban.com/news/detail-608941.html

到了这里,关于Verilog语法-模块module[Day2学习笔记]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Verilog Tutorial(1)如何编写一个基本的 Verilog Module(模块)

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 这篇文

    2024年02月02日
    浏览(32)
  • 1、verilog语法——模块的结构

    目录 前言 一、什么是模块 二、模块的内容 1.I/O声明的格式 2.内部信号的声明 3.功能定义 三、模块的调用(例化) 要点注意 本次的学习内容是verilog的基本设计单元:模块(module) 模块(module)是verilog设计基本单元。一共由两部分组成:一部分是描述接口,另一部分描述逻辑

    2024年02月08日
    浏览(35)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(42)
  • Verilog语法——2.模块例化、运算符

    参考资料 【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】 2.1.1 什么是模块例化 例化,即将项目不断拆分成次级功能模块,然后从最简单的模块开始实现,进而完成整个复杂项目 2.1.2 模块例化的方法 针对已经抽象好的模块,需要

    2024年01月16日
    浏览(43)
  • HDLBites学习笔记之Error (10200): Verilog HDL Conditional Statement error at top_module

    HDLBites 第84题 异步复位D 触发器 https://hdlbits.01xz.net/wiki/Dff8ar 报错Error (10200): Verilog HDL Conditional Statement error at top_module 原代码如下 module top_module (     input clk,     input areset,   // active high asynchronous reset     input [7:0] d,     output [7:0] q );     always@(posedge clk or posedge areset )    

    2024年02月04日
    浏览(34)
  • day10-verilog---模块的调用,任务和函数

    在做模块划分时,通常会出现这种情形,某个大的模块中包含了一个或多个功能子模块,verilog是通过 模块调用 或称为 模块实例化 的方式来实现这些子模块与高层模块的连接的 调用模块实例化的一般形式为: 模块名参数列表实例名(端口列表); 其中参数列表是传递到子

    2024年02月02日
    浏览(38)
  • Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog进行FPGA/IC设计值,通常划分为各个子模块,木模块之间可能相互例化,并在顶层统一例化,并连接成一个顶层模块文件。 基本的模块模板: 如果模块内的变量位宽参数化,则模块模板为: 例化带参数的模块: 端口类型/端口描述 input 设计模块只能使用其input端口从外部

    2024年02月13日
    浏览(36)
  • 【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

    今天的实验是计数器实验的升级,设计让8个LED灯以每个0.5s的速率循环闪烁 1 移位法实现 1.1 移位方法1 每个LED灯代表一位,共8位,亮为1,灭为0 如何实现这样的逻辑呢? 移位操作即可! 怎么样才能移位呢? 第一个状态需满足最低位为1,然后每次左移1个 源代码 仿真代码 功

    2024年01月16日
    浏览(49)
  • 基于Basys2的数码管动态扫描module(verilog)的模块化设计

        目录 一、数码管工作原理  二、Verilog模块设计 1、原理 (1)动态扫描的优点: (2)动态扫描原理简介: 2、Verilog模块的设计 (1)分频器:  2、译码器模块: 3、动态扫描模块: 4、顶层模块: 三、写在最后: 在大二下学期学习《Verilog与FPGA实现》的时候鲲鲲给我们布

    2024年02月09日
    浏览(64)
  • Verilog语法学习——边沿检测

    若为下降沿检测,则为: TB文件 注意,若TB文件中输入信号signal_in的上升下降沿和sys_clk同步,则检测不出边沿。所以我将输入信号的持续时间都设定为随机数字,来和sys_clk产生区别 仿真波形 若出现不定值x或高阻值z,则检测不准确。 可以改进为: 解释: == 和 !== 称为逻辑

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包