美文网首页
Verilog 语言简介

Verilog 语言简介

作者: finlu | 来源:发表于2018-07-23 15:53 被阅读0次

什么是 Verilog 语言

Verilog一般指Verilog HDL。Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

Verilog 语言要素

​ Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯。一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受。不过,Verilog与C语言还是存在许多差别。另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器过程中的非阻塞赋值等。总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言。

Verilog基本语法

Verilog基本结构

/* 模块声明 */
module flowing_light(
    /* 端口定义 */
    input clk,
    input rst,
    output [15:0] led
);

    /* 信号类型声明 */
    reg [29:0] cnt_reg;
    reg [15:0] light_reg;

    always@ (posedge clk) begin
        /* 功能描述 */
        if(!rst)
            cnt_reg <= 0;
        else if (cnt_reg >= 100000000)
            cnt_reg <= 0;
        else
            cnt_reg += 1;
    end

    always@ (posedge clk) begin
        /* 功能描述 */
        if(!rst)
            light_reg <= 16'h0001;
        else if(cnt_reg == 29'd100000000) begin
            if(light_reg == 16'h8000)
                light_reg <= 16'h0001;
            else
                light_reg <= light_reg << 1;
            end
    end

    assign led = light_reg;
/* 模块结束声明 */
endmodule

Verilog 常用信号类型

wire型

输出始终随输入的变化而变化的变量,表示结构实体,如门店了之间的物理连接。

reg型

对应具有状态保持作业的电路元件,如触发器、寄存器等。

Always 块

always块的基本说明

  • 主要描述逻辑功能的块
  • 括号内为敏感信号表

组合逻辑快块

always (*) begin
    /* 逻辑语句 */
end

时序逻辑块

always (posedge clk) begin
    /* 逻辑语句 */
end

带异步下降沿复位的时序逻辑块

always (posedge clk or negedge rst) begin
    /* 逻辑语句 */
end

always@(*)和always不加@的区别

  • 若没有@,则是一般在teastbench 中产生时钟信号,指不会满足特定的条件,执行完一次后立马继续执行下一次,一直重复执行。
  • 有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。

所以说:当使用always块生成时钟信号时,不用加上@,加上之后编译会发生错误。

模块例化

/* 模块定义 */
module add(
    input a,b;
    output c;
    assign c=a+b);
endmodule
/* 模块定义 */
module double_add(
    input d,e,f,
    output g
);
    /* 模块例化1 */
    /* add:模块名;add_inst1:例化名称 */
    add add_inst1(
        /* 端口映射 */
        .a(d),
        .b(e),
        .c(temp)
    );
    /* 模块例化2 */
    add add_inst2(
        /* 端口映射 */
        .a(f),
        .b(temo),
        .c(g)
    );
endmodule

相关文章

网友评论

      本文标题:Verilog 语言简介

      本文链接:https://www.haomeiwen.com/subject/tgjjmftx.html