Verilog开发中“=”和“<=”的区别

本文详细解析了Verilog中阻塞与非阻塞赋值的区别及应用原则,通过实例说明两种赋值方式如何影响信号值的变化,帮助读者理解在不同电路设计场景下选择合适的赋值方式。
AI助手已提取文章相关产品:

非阻塞(Non_Blocking)赋值方式( 如 b <= a; ), 块结束后才完成赋值操作,值并不是立刻就改变的, 这是一种比较常用的赋值方法。(特别在编写可综合模块时)。

阻塞(Blocking)赋值方式( 如 b = a; ),  赋值语句执行完后,块才结束,值在赋值语句执行完后立刻就改变的,  可能会产生意想不到的结果。

西安企云基创软件

一般情况下组合逻辑使用=赋值,时序逻辑使用<=赋值。

举个例子:初始化m=1,n=2,p=3;分别执行以下语句
1、begin 
   m=n;n=p;p=m;
   end
2、begin
   m<=n;  n<=p;  p<=m;
   end
结果分别是:1、m=2,n=3,p=2;(在给p赋值时m=2已经生效) 
           2、m=2,n=3,p=1;(在begin-end过程中,m=2一直无效而是在整体执行完后才生效)
这两种赋值“=”用于阻塞式赋值;“<=”用于非阻塞式赋值中。
阻塞赋值:阻塞赋值语句是在这句之后所有语句执行之前执行的,即后边的语句必须在这句执行完毕才能执行,所以称为阻塞,实际上就是顺序执行。
非阻塞赋值:非阻塞赋值就是与后边相关语句同时执行,即就是并行执行。
所以一般时序电路使用非阻塞赋值,assign语句一般使用=阻塞赋值;
组合逻辑电路使用阻塞赋值。

在使用阻塞赋值和非阻塞赋值时的八大原则:

1)时序电路建模时,采用非阻塞赋值;

2)锁存器电路建模时,采用非阻塞赋值;

3)用always块建立组合逻辑模型时,采用阻塞赋值;

4)用always块建立时序和组合逻辑混合电路时,采用非阻塞赋值;

5)不要在同一个always块中同时使用非阻塞赋值和阻塞赋值;

6)不要在一个以上的always块中为同一个变量赋值;

7)用$strobe系统任务来显示用非阻塞赋值的变量值;

8)在赋值时,不要用#0延迟;



您可能感兴趣的与本文相关内容

<think>嗯,用户想了解Verilog或VHDL中PERIOD参数的定义用法。首先,我需要回忆一下这两种硬件描述语言中参数的概念。在Verilog中,参数是用`parameter`关键字定义的,而在VHDL中则是使用`generic`。PERIOD通常用来表示时钟周期,可能在测试台或者设计中用于生成时钟信号。 接下来,我需要确认PERIOD参数的具体应用场景。比如,在时钟生成模块中,PERIOD的值决定了时钟频率。例如,如果PERIOD设置为10纳秒,对应的时钟频率就是100MHz。需要举例说明如何在代码中定义使用这个参数。 然后,考虑用户可能的疑问,比如参数的作用范围、如何覆盖默认值等。在Verilog中,可以通过模块实例化时传递新值来覆盖参数,而VHDL中则在实体实例化时使用generic map。需要说明这些用法,并给出代码示例。 另外,用户可能不清楚参数与常量的区别。需要解释参数(parameter/generic)在编译时可配置,而常量(localparam/constant)在编译时固定。这样用户可以根据需要选择合适的定义方式。 还要注意语法正确性,比如Verilog的参数定义在模块内部,VHDL的generic在实体声明部分。同时,时钟生成的代码示例需要正确使用参数,比如在always块或process中翻转时钟信号。 最后,生成相关问题时要覆盖参数定义、覆盖方法、时钟生成、参数与常量的区别以及优化方法等方面,确保用户能全面理解PERIOD的应用相关知识。</think># Verilog/VHDL中PERIOD参数的定义与用法 ## 一、参数定义 在硬件描述语言中,PERIOD参数用于定义时钟周期的时间长度,属于时序约束的重要参数。 1. **Verilog语法**: ```verilog module clock_gen( output reg clk ); parameter PERIOD = 10; // 默认10ns周期(100MHz) initial clk = 0; always #(PERIOD/2) clk = ~clk; endmodule ``` 2. **VHDL语法**: ```vhdl entity clock_gen is generic( PERIOD : time := 10 ns -- 默认时钟周期 ); port( clk : out std_logic ); end entity; architecture Behavioral of clock_gen is begin process begin clk <= '0'; wait for PERIOD/2; clk <= '1'; wait for PERIOD/2; end process; end architecture; ``` ## 二、主要应用场景 1. **测试平台开发**:在Testbench中生成可配置的时钟信号[^1] 2. **时序约束**:综合工具根据周期参数优化电路布局 3. **IP核配置**:参数化设计可复用模块 4. **多时钟域系统**:协调不同频率模块的交互时序 ## 三、参数覆盖方法 1. **Verilog参数覆盖**: ```verilog clock_gen #(.PERIOD(20)) slow_clk(); // 覆盖为20ns周期 ``` 2. **VHDL参数覆盖**: ```vhdl uut: entity work.clock_gen generic map( PERIOD => 25 ns ) port map(...); ``` ## 四、参数与常量的区别 | 特性 | 参数(parameter/generic) | 常量(localparam/constant) | |-------------|-------------------------|---------------------------| | 可配置性 | ✅ 支持外部修改 | ❌ 固定值 | | 作用域 | 模块级 | 局部作用域 | | 典型应用 | 时钟周期、总线宽度 | 状态编码、数学常数 |
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值