【Verilog练习】关键字和语句(二)

目录

parameter

posedge & negedge

integer & real

always_ff & always_comb


parameter

在Verilog中,parameter是一种用于定义常量的关键字。它用于在代码中声明一个常量,并且该常量的值在编译时确定,并且在整个设计中都是不可变的。

paramemter的一般形式如下:

parameter parameter_name = value;

在这个结构中,parameter_name是参数的名字,而value是参数的值。参数的值可以是一个常数、表达式或者其他参数的值。参数值的计算发生在编译时,而不是在仿真运行时。

parameter通常用于定义设计中的常量,例如时钟周期、数据宽度等。通常使用参数,可以方便地在设计中引用这些常量,并且在需要修改时只需要修改参数的定义,而不需要修改所在引用该常量的地方(类似于C语言中的define)。

使用parameter可以增强代码的可读性和可维护性,并且有助于提高设计的灵活性和重用性。

posedge & negedge
  • posedge表示时钟信号的上升沿。当时钟信号从低电平变为高电平时,posedge事件发生。

  • negedge表示时钟信号的下降沿。当时钟信号从高电平变为低电平时,negedge事件发生。、

    这两个关键字通常用于时序逻辑的描述中,特别是在时钟触发的情况下。例如,在时钟上升沿触发的时序逻辑中,可以使用posedge来指示何时执行某些操作。而在时钟下降沿触发的时序逻辑中,则可以使用negedge

    下面是一个简单的示例:

    module clk_edge_detector(
        input wire clk,
        output reg posedge_detected,
        output reg negedge_detected
    );
        
        always @(posedge clk) begin
            // 当时钟信号上升沿发生时,执行以下代码
            posedge_detected <= 1;
        end
    ​
        always @(negedge clk) begin
            //  当时钟信号下降沿发生时,执行以下代码
            negedge_detected <= 1;
        end
        
    endmodule

integer & real
  • integer:用于声明整数类型的变量。整数变量在Verilog中表示带符号的整数值,通常用于存储整数数据或进行算术运算。

  • real:用于声明实数类型的变量。实数变量在Verilog中表示浮点数值,可以存储带有小数部分的数值,通常用于仿真中涉及浮点数运算的情况。

    下面是一个简单的示例:

    module numeric_variables_example;
        
        integer count = 10;
        real pi = 3.14159;
       
        initial begin
            $display("Count: %d",count);
            $display("pi: %f",pi);
        end
        
    endmodule

always_ff & always_comb

在Verilog中,它们是SystemVerilog的关键字,用于描述特定类型的always块。它们帮助设计者更明确地表示逻辑块的行为类型,并提供额外的语法检查。这有助于减少设计错误,确保代码的可读性和可维护性。

  • always_ff:用于描述时序逻辑,也称为触发器逻辑或时钟驱动逻辑。在always_ff块中,代码通常在特定的时钟沿(例如posedge clk)上执行,模拟硬件中的触发器行为。它主要用于寄存器和状态变量的更新。

  • always_comb:用于描述组合逻辑。在always_comb模块中,代码根据输入的变化而立即执行,类似于组合电路的行为。组合逻辑没有时序约束,输出依赖于输入信号。这个关键字确保没有错误地定义了时序行为,如遗忘信号的敏感性列表,或者在组合逻辑中引入了不必要的状态。

以下是关于这两个关键字的例子:

module example_ff_comb(
    input logic clk,
    input logic reset,
    input logic [3:0] in,
    output logic [3:0] out
);
    
    always_ff @(posedge clk or posedge reset) begin
        if(reset) begin
            out <= 4'd0;
        end else begin
            out <= in;
        end
    end
    
    logic [3:0] intermediate;
    
    always_comb begin
        intermediate = in + 4'd1;
    end
endmodule
        

在这个例子中,always_ff块描述了一个简单的寄存器逻辑,基于时钟的上升沿或复位信号触发。而always_comb块描述了组合逻辑,根据输入信号及时计算结果。always_comb不使用时钟触发,而是依赖于敏感性列表的信号变化。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯电影配红酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值