Verilog基础学习二

Verilog基础学习二


文章目录

  • Verilog基础学习二
  • 一、always 块
    • 1.阻塞性赋值和非阻塞性赋值
  • 二、条件语句
    • 1.if 语句 基本用法
    • 2.避免引入锁存器
    • 3.case 语句
    • 4.casez 语句
  • 三、归约运算符(Reduction Operators)
  • 四、for循环
    • Problem : Combinational for-loop: 255-bit population count
    • Problem : Generate for-loop: 100-bit binary adder 2
    • 五、Generate 块
    • Problem : Generate for-loop: 100-digit BCD adder
  • 总结


一、always 块

我们知道数字电路是由导线连接的逻辑门组成,因此任何电路都可以表示为moduleassign语句的某种组合。但是,有时候这不是描述电路最简便的方法。过程块(比如always块)提供了一种用于替代assign语句描述电路的方法。

有两种always块是可以综合出电路硬件的:

综合逻辑:always @(*)
时序逻辑:always @(posedge clk)

1.阻塞性赋值和非阻塞性赋值

在Verilog中有以下三种赋值方法:

连续赋值(assign x=y;):不能在过程块内使用;
过程阻塞性赋值(x=y;):只能在过程块中使用;
过程费阻塞性复制(x<=y):只能在过程块内使用。

在组合always块中,使用阻塞性赋值。在时序always块中,使用非阻塞性赋值。具体为什么对设计硬件用处不大,还需要理解Verilog模拟器如何跟踪事件(译者注:的确是这样,记住组合用阻塞性,时序用非阻塞性就可以了)。不遵循此规则会导致极难发现非确定性错误,并且在仿真和综合出来的硬件之间存在差异。

示例代码如下:

module top_module(
    input clk,
    input a,
    input b,
    output wire out_assign,
    output reg out_always_comb,
    output reg out_always_ff   );

    assign out_assign = a ^ b;
    always@(*) out_always_comb = a ^ b;
    always@(posedge clk) out_always_ff <= a ^ b;
    
endmodule

二、条件语句

1.if 语句 基本用法

基本if语句:

always @(*) begin
    if (condition) begin
        out = x;
    end
    else begin
        out = y;
    end
end

条件(三元)运算符:

assign out = (condition) ? x : y;

condition ? if_true : if_false

2.避免引入锁存器

组合电路输出必须在所有输入的情况下都有值。这意味着必须需要else子句或着输出默认值。

3.case 语句

Verilog中的case语句几乎等同于if-else if-else序列,它将一个表达式与其他表达式列表进行比较。它的语法和功能与C语言中的switch语句稍有不同:

always @(*) begin     // This is a combinational circuit
    case (in)
      1'b1: begin 
               out = 1'b1;  // begin-end if >1 statement
            end
      1'b0:    out = 1'b0;
      default: out = 1'bx;
    endcase
end

1、case语句以case开头,每个case项以冒号结束。而switch语句没有。

2、每个case项只执行一个语句。 *这样就不需要C语言中break来跳出switch。*但这也意味着如果您需要多个语句,则必须使用begin … end。

3、case项允许重复和部分重叠,执行程序匹配到的第一个,而C语言不允许重复的case项目

4.casez 语句

如果case语句中的case项与某些输入无关,就可以减少列出的case项。这就是casez的用途:它在比较中将具有值z的位视为无关项(即输入01都会匹配到)。

还有一个类似的casex,将输入的x和z都视为无关。不认为casex比casez有什么特别的好处。
(作者个人感觉没必要用casex,z和x状态的问题涉及电路的基本知识)
符号"?" 是z的同义词,所以2’bz0与2’b?0相同。

always @(*) begin
    casez (in[3

你可能感兴趣的:(Verilog语言,fpga开发)