VerilogHDL基本语法和程序

Verilog语法

注意点

  • 在always过程块中赋值的变量应该定义为 reg 型。

assign关键字

assign 关键字用于在 Verilog 中创建连续赋值,它可以将一个表达式赋值给一个 wire 类型的信号。assign 赋值发生在每个仿真时间步骤的开始,因此连续赋值可以用于在组合逻辑中实现一些功能。

下面是一个使用 assign 的简单例子,实现了一个两个输入信号的异或门:

module xor_gate(
    input a,
    input b,
    output reg y
);
	wire a,b;
    assign y = a ^ b;
endmodule
//这里使用 assign 关键字将 a ^ b 赋值给 y,从而实现了异或门的逻辑。
//需要注意的是,
//使用 assign 赋值的信号必须是 wire 类型的信号,
//而且不能使用时序逻辑语句来修改这些信号的值

reg 关键字

reg 是 Verilog HDL 中的一种数据类型,表示寄存器类型。在模块中,我们通常使用 reg 声明模块的内部寄存器变量。

reg 变量可以存储数字、布尔、字符串等类型的值,可以通过赋值语句来修改其值。在模块中,reg 变量的值可以在 always 块、initial 块或任务中修改。

下面是一个简单的例子,展示如何在模块中使用 reg 变量:

module example_module(
    input clk,
    input rst,
    output reg [7:0] counter
);

always @(posedge clk, posedge rst) begin
    if (rst) begin
        counter <= 8'b0; // 复位计数器为0
    end else begin
        counter <= counter + 1; // 正常加1
    end
end

endmodule

在这个例子中,我们声明了一个名为 counter 的 8 位寄存器变量,并在 always 块中使用了该变量。当 rst 信号为高电平时,我们将 counter 变量复位为0。当 clk 信号上升沿到来时,我们将 counter 变量的值加 1。output reg 声明指定了 counter 变量是该模块的一个输出端口,并且是一个寄存器类型。

需要注意的是,在 always 块中,对于 reg 变量的修改操作必须在时钟上升沿或下降沿的敏感列表中,否则在模拟过程中可能会导致意外的行为。

<=运算符

在 Verilog HDL 中,= 表示的是赋值操作符,而 <= 表示的是非阻塞式赋值操作符。在时序逻辑中,我们通常使用 <= 来表示寄存器或者组合逻辑的输出信号。这是因为 <= 是一种非阻塞式赋值,可以在时钟边沿触发时更新输出信号,而不受其他语句的阻塞

wire关键字

用途1:
wire clk,rst;
wire clk, rst; 是 Verilog HDL 语言中的语句,用于声明两个信号变量 clk 和 rst。

在 Verilog HDL 中,wire 类型的变量用于声明一个信号线,它表示一种被连接到模块输入或输出端口的信号类型,因此 wire 类型的变量通常被用来表示模块的输入输出端口,或者用于将模块中的各个部分连接起来。

在你的程序中,clk 和 rst 分别表示模块的时钟信号和复位信号,声明为 wire 类型的变量表示它们是从模块的外部输入的信号。因此,在模块实例化时,需要将外部的时钟信号和复位信号连接到这两个信号变量上,以便模块能够正确地工作。

8421BCD码是什么意思

8421BCD码是一种二进制编码方式,其中每个十进制数位用4个二进制位表示,这四个二进制位分别代表这个数位上的权值分别为8、4、2和1。因此,它的名称中“8421”代表了这四个权值,而“BCD”代表了“二进制编码的十进制数”(Binary Coded Decimal)的缩写。

举个例子,如果要表示十进制数53,就可以使用8421BCD码来表示为0101 0011,其中第一个字节“0101”代表5,第二个字节“0011”代表3。这种编码方式在数字电路中常被用于数码管的驱动和BCD码加法器等电路中。

练习实例:

模7方向可控计数器

module mode7(clk,
             rst,
             dir,    // dir为 1 表示加法,dir 为 0 表示减法
             count);
    input clk,rst,dir;
    wire clk,rst;
    output reg [2:0] count;
    
    always @(posedge clk or negedge rst)
    begin
        if (~rst)
            count <= 3'b000;
        else if (dir)  // 加法
        begin
            if (count == 3'b110)
                count <= 3'b000;
            else
                count = count + 1;
        end
        else
            count <= (count == 3'b000) ? 3'b110 : count - 1;
    end
endmodule

模4方向可控计数器

module counter(clk,rst,dir,count);
    input clk,rst,dir;
    output [1:0] count;
    
    reg [1:0] count;  // 声明寄存器变量
    always @(posedge clk, negedge rst)
    begin
        if (~rst)
            count <= 2'b00;
        else if (dir)
            count <= (count == 2'b11) ? 2'b00 : count + 1;
        else
            count <= (count == 2'b00) ? 2'b11 : count - 1;
    end
endmodule

带同步复位的4位模10 8421BCD码计数器

猜你喜欢

转载自blog.csdn.net/m0_63388363/article/details/129912329