Verilog 基础

Quartus设计和仿真

在建立完一个项目后,在设计中可以采用图形设计方法,也可以使用语言设计方法,一般是两种方法混用

file - new 选择新建文件类型。

其中,“AHDL File” 是AHDL格式的文件;

“Block Diagram/Schematic File” 是图形文件;

“Verilog HDL File” 是Verilog HDL 格式的文件;

“VHDL File” 是VHDL格式的文件。

编辑完一个文件之后,需要对这个程序进行编译,检查语法上的错误。

我们需要把当前的文件设置为当前顶层实体,使得Quartus编译时就只编译这个文件。

在Verilog 模块有3种方法可在模块中产生逻辑.

  • 连续赋值语句(assign).

  • 实例调用.

  • 过程块(initial,always).

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免仿真时出现竞争冒险现象;

在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变;

“=”阻塞赋值,”<=”非阻塞赋值。

阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行

非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值

  • 在assign语句中必须用阻塞赋值
  • Wire型变量相当于硬件电路中的各种连接,它不储存值,紧跟前面的信号变化,在assign语句中使用
  • Reg型变量对应的是有状态保持作用的元件,如触发器,寄存器。在always,initial语句中被赋值的变量必须是 reg 型
  1. 用assign声明语句进行持续赋值(数据流描述)

    如:assign a = b & c;

  2. 用实例元件进行功能定义(结构描述)

    如:and2 u1(c,a,b);

  3. 用“always”块进行功能描述(行为描述)

    如:always @(posedge clk)

    ​ begin

    ​ q<=d;

    ​ end

组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入,与电路原来的状态无关。

而时序逻辑在逻辑功能上的特点是任意时刻的输出不仅仅取决于当前的输入信号,而且还取决于电路原来的状态。

有限状态机

在verilog里经常会用到有限状态机,处理相对复杂的逻辑,设定好不同的状态,根据触发条件跳转到对应的状态,在不同的状态下做相应的处理。有限状态机主要用到always及case语句。下面以一个四状态的有限状态机举例说明。

image-20211130174947329

在程序中设计了8位的移位寄存器,在Idle状态下,判断shift_start信号是否为高,如果为高,进入Start状态,在Start状态延迟100个周期,进入Run状态,进行移位处理,如果shift_stop信号有效了,进入Stop状态,在Stop状态,清零q的值,再跳转到Idle状态。

Mealy有限状态机,输出不仅与当前状态有关,也与输入信号有关,在RTL中会与输入信号有连接。

Moore有限状态机,输出只与当前状态有关,与输入信号无关,输入信号只影响状态的改变,不影响输出,比如对delay_cnt和q的处理,只与state状态有关。

仿真

程序编译通过后,需要仿真刚刚写完的程序。仿真在整个项目设计中具有相当大的作用,这些仿真可以使我们及早地发现程序设计中的低级错误,一般,我们在设计完一个程序模块后,就应该进行仿真,检查每个模块仿真没问题之后,就可以组合成更大的模块,然后再进行这一级的仿真,直至顶层模块,这样就有效地保证了程序的设计可靠性。

Verilog中output端口设置为reg变量

为了把一个输出信号赋给输出端口,通常由以下两种处理方式:

方式A:

module test1(
    input clk;
    output[7:0] counter;
);
    reg[7:0] counter_reg;
    always@(posedg clk)
        begin
            counter_reg<=counter_reg+1'b1;
        end
    assign counter=counter_reg;
endmodule

方式B:

module test2(
    input clk;
    output reg [7:0] counter;
);
    always@(posedg clk)
        begin
            counter<=counter+1'b1;
        end
endmodule

A中单独设置内部变量,在Always中将输出信号赋给counter_reg,然后再assign中将counter和counter_reg连接起来。

B中直接将输出端口设置为reg型信号,直接在always中赋值。

两种处理方式的结果一致。

RTL视图均为:

img

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信