fpga系列 HDL: 05 阻塞赋值(=)与非阻塞赋值(<=)

2024-05-27 21:20

本文主要是介绍fpga系列 HDL: 05 阻塞赋值(=)与非阻塞赋值(<=),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 在Verilog硬件描述语言(HDL)中,信号的赋值方式主要分为两种:连续赋值和过程赋值。每种赋值方式有其独特的用途和语法,并适用于不同类型的电路描述。

1. 连续赋值(Continuous Assignment,assign 和=)

  • 连续赋值主要用于描述组合逻辑,通常与assign关键字一起使用。它在顶层模块或过程块外部进行,用于对wire类型的信号赋值。

特点

  • 组合逻辑:连续赋值用于实现组合逻辑,表示输出信号始终等于表达式的值。
  • 实时更新:当右边的表达式中的任何信号发生变化时,左边的信号会立即更新。
  • 信号类型:通常用于wire类型信号。

示例

示例 1

module blink_led(input wire a,output wire b
);assign b = a;endmodule

在这里插入图片描述

示例 2

module combinational_logic (input wire a,input wire b,output wire c
);// c 始终等于 a 和 b 的逻辑与assign c = a & b;
endmodule

在这里插入图片描述

2. 过程赋值(Procedural Assignment)

  • 过程赋值用于过程块(如alwaysinitial块)内,适用于描述组合逻辑或时序逻辑。过程赋值可以进一步分为两种:阻塞赋值(=)和非阻塞赋值(<=)。

2.1 阻塞赋值(Blocking Assignment,=

特点 :

  • 顺序执行:阻塞赋值按书写顺序执行,一个语句必须在前一个语句完成后才能执行下一个语句。
  • 阻塞行为:在赋值完成之前,后续的语句不会执行。相当于“阻塞”了后续操作。
  • 主要用于组合逻辑:通常用于描述组合逻辑,在always @(*)块中使用。

示例 :

  • 这个代码,阻塞赋值与下边的非阻塞赋值电路一样
module blink_led(
clk,reset_n,a,b,c,out);input clk;input reset_n;input a,b,c;output reg [1:0] out;reg [1:0] d;always@(posedge clk or negedge reset_n)if(!reset_n)beginout =2'b0;d =0;    endelse beginout =d+c;d =a+b;endendmodule

ISE的RTL Schematic

在这里插入图片描述
在这里插入图片描述

vivado的 Schematic

在这里插入图片描述

更换两句的顺序

在这里插入图片描述

module blink_led(
clk,reset_n,a,b,c,out);input clk;input reset_n;input a,b,c;output reg [1:0] out;reg [1:0] d;always@(posedge clk or negedge reset_n)if(!reset_n)beginout =2'b0;d =0;    endelse begind =a+b;out =d+c; // 这里的 out 使用更新后的 d 值,电路图中少一一个寄存器endendmodule

ISE的RTL Schematic

在这里插入图片描述
在这里插入图片描述

ISE的Technology Schematic

在这里插入图片描述

vivado

在这里插入图片描述

在这里插入图片描述

2.2 非阻塞赋值(Non-blocking Assignment,<=

特点 :

  • 并行执行:非阻塞赋值允许赋值操作并行执行,不必等待前一个语句完成。
  • 主要用于时序逻辑:通常用于描述时序逻辑,在always @(posedge clk)块中使用。

示例:

module mux2(
clk,reset_n,a,b,c,out);input clk;input reset_n;input a,b,c;output reg [1:0] out;reg [1:0] d;always@(posedge clk or negedge reset_n)if(!reset_n)beginout =2'b0;d =0;    endelse begind <=a+b;out <=d+c;// 这里的 out 使用更新前的 d 值endendmodule
vivado

在这里插入图片描述
在这里插入图片描述

更换两句的顺序电路图没有改变

在这里插入图片描述

手绘示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.对比与应用场景

  1. 连续赋值 vs. 过程赋值

    • 连续赋值:用于wire类型信号,描述组合逻辑。
    • 过程赋值:用于reginteger等类型信号,描述组合或时序逻辑。
  2. 阻塞赋值 vs. 非阻塞赋值

    • 阻塞赋值:用于组合逻辑,按顺序执行,通常在always @(*)块中。
    • 非阻塞赋值:用于时序逻辑,并行执行,通常在always @(posedge clk)块中。

CG

  • https://www.bilibili.com/video/BV1va411c7Dz?p=11

这篇关于fpga系列 HDL: 05 阻塞赋值(=)与非阻塞赋值(<=)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008628

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma