FPGA中一些基本概念原理的区分

一、wire型变量与reg变量

在 Verilog 中,wire 和 reg 是两种不同类型的变量,它们有着不同的特性和用途

1.1 wire 变量

  1. wire 变量用于连接模块中的输入、输出以及内部信号线。

  2. 它主要用于表示连续赋值的逻辑连接,类似于硬件电路中的导线。

  3. wire 变量不能在 always 块或 initial 块中赋值,它们只能通过连续赋值“assign”语句连接到其他信号,

1.2 reg 变量

  1. 它主要用于表示时序逻辑中的寄存器或存储单元。
  2. reg 变量可以在 always 块或 initial 块中赋值,用于描述时序逻辑的行为。

因此,wire 变量和 reg 变量的本质区别在于它们的用途和赋值方式。wire 主要用于连接信号,而 reg 主要用于存储时序逻辑的状态值。

1.3 使用场景

module ExampleModule(input a, input b, output c);
  
  // 使用 wire 连接输入和输出
  wire w1;
  assign w1 = a & b;  // 连接输入信号 a 和 b

  assign c = w1;  // 连接输出信号 c

  // 使用 reg 存储状态值
  reg [3:0] counter;  // 定义一个 4 位寄存器
  
  always @(posedge clk) begin
    if (reset) begin
      counter <= 4'b0000;  // 在上升沿时重置寄存器的值
    else
      counter <= counter + 1;  // 在上升沿时递增寄存器的值
    end
  end

endmodule

在这个示例中,wire 变量 w1 用于连接输入信号 a 和 b 到输出信号 c,而 reg 变量 counter 被用作一个 4 位的寄存器,用于存储时序逻辑中的状态值。wire 用于连接逻辑,而 reg 用于存储状态。

二、阻塞赋值与非阻塞赋值

2.1 阻塞赋值

·阻塞赋值使用“=”符号进行赋值。
·在 always 块中使用阻塞赋值时,会按照代码的顺序依次执行赋值语句。
·每次遇到阻塞赋值语句时,会立即计算并更新被赋值的变量。
·阻塞赋值会导致并发赋值,可能会引起意外的结果,特别是在多个赋值操作的情况下。

2.2 非阻塞赋值

·非阻塞赋值使用“<=”符号进行赋值。
·在 always 块中使用非阻塞赋值时,所有赋值语句会同时执行,但在时钟信号的边沿才会生效更新被赋值的变量。
·非阻塞赋值可以用于描述时序逻辑中的寄存器更新操作,确保时序逻辑的正确性。
·非阻塞赋值消除了并发赋值问题,避免了多个赋值操作之间的相互影响,提高了代码的可读性和可维护性。

2.3 使用场景

(1)阻塞赋值的使用情况:
·适用于组合逻辑电路或者需要立即更新变量值的情况。
·在同一个 always 块内多个赋值语句的情况下,可能会导致意外结果。
 

module blocking_example (
    input wire a,
    input wire b,
    output reg c
);

always @ (a, b)
begin
    // 阻塞赋值,立即更新变量值
    c = a & b;
end

endmodule


(2)非阻塞赋值的使用情况:
·适用于时序逻辑电路中需要保持状态稳定性的情况。
·用于在时钟信号的边沿更新寄存器值,避免并发赋值问题。


module non_blocking_example (
    input wire clk,
    input wire rst,
    input wire data,
    output reg reg_data
);

always @(posedge clk or posedge rst)
begin
    if (rst)
    begin
        // 重置寄存器值
        reg_data <= 0;
    end
    else
    begin
        // 非阻塞赋值,在时钟信号的边沿更新寄存器值
        reg_data <= data;
    end
end

endmodule


通过以上示例,可以看到阻塞赋值适用于需要立即更新变量值的情况,而非阻塞赋值适用于时序逻辑中需要保持状态稳定性的情况。在实际设计中,根据逻辑需求选择合适的赋值方式可以确保设计的正确性和性能。

三、常见条件语句

在Verilog中,常见的条件语句包括if语句、case语句和unique case语句。以下是它们的区别和用法:

3.1 if 语句

if语句用于在条件满足时执行特定的操作。
可以包含多个else if和else部分。
在每个时钟周期只能选择一个分支执行。


module if_statement_example (
    input wire a,
    output reg b
);

always @ (a)
begin
    if (a == 1)
        b = 1;
    else if (a == 0)
        b = 0;
    else
        b = 0; // 默认情况
end

endmodule


3.2 case 语句


case语句根据输入信号的不同值执行相应的操作。
可以使用case、casex或casez,分别表示精确匹配、模糊匹配X值、模糊匹配Z值。
每个case分支可以有多个值或范围。

module case_statement_example (
    input wire [1:0] opcode,
    output reg result
);

always @ (*)
begin
    case (opcode)
        2'b00: result = 4'b0000;
        2'b01: result = 4'b0011;
        2'b10: result = 4'b1111;
        default: result = 4'bXXXX; // 默认情况
    endcase
end

endmodule

 

3.3 unique case 语句


unique case语句用于确保每个分支值都唯一,不会有重复的情况。
如果出现多个分支值相同的情况,编译器会报错。


module unique_case_statement_example (
    input wire [1:0] sel,
    output reg out
);

always @ (*)
begin
    unique case (sel)
        2'b00, 2'b01: out = 1;
        2'b10: out = 0;
        default: out = 0; // 默认情况
    endcase
end

endmodule

四、常见操作运算符

4.1 逻辑运算符

与(&):两个输入都为高时输出高,否则输出低。
或(|):两个输入至少有一个高时输出高。
非(~):对输入取反,即高变低,低变高。
异或(^):两个输入不同时为高或者不同时为低时输出高,否则输出低。

4.2 算术运算符

加法(+):对两个数进行加法运算。
减法(-):对两个数进行减法运算。
乘法(*):对两个数进行乘法运算。
除法(/):对两个数进行除法运算,通常需要使用特殊的算法实现。

4.3 比较运算符

等于(==):判断两个操作数是否相等。
不等于(!=):判断两个操作数是否不相等。
大于(>):判断左操作数是否大于右操作数。
小于(<):判断左操作数是否小于右操作数。
大于等于(>=):判断左操作数是否大于等于右操作数。
小于等于(<=):判断左操作数是否小于等于右操作数。

与‘==’不同,全等将x和z都当成确定的值进行比较,当表述完全相同时输出1;此外,在做全等比较时,对于两个比较位数不等的情况,不会像处理操作符‘==’那样作高位补0操作,而会直接判断两数据不等。

4.4 移位运算符

左移(<<):将操作数向左移动指定的位数,右侧空出的位用0填充。
右移(>>):将操作数向右移动指定的位数,左侧空出的位根据有符号或无符号右移来填充。

4.5 位运算符

与(&):按位与操作。
或(|):按位或操作。
非(~):按位取反操作。
异或(^):按位异或操作。

结尾语

后来啊,
新年到了,我就来了…
鞭炮响了,我就走了…
好像…我才是那年兽
2024-2-16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/391797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

春节专题|产业7问:区块链厂商的现在和未来——基础设施厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…

第18讲 投票帖子管理实现

后端&#xff1a; /*** 删除指定id的投票信息* param id* return*/ GetMapping("/delete/{id}") Transactional public R delete(PathVariable(value "id")Integer id){voteDetailService.remove(new QueryWrapper<VoteDetail>().eq("vote_id…

【探索Linux】—— 强大的命令行工具 P.22(POSIX信号量)

阅读导航 引言一、POSIX信号量的基本概念二、信号量的相关操作1 . 初始化信号量sem_init ( )&#xff08;1&#xff09;原型&#xff08;2&#xff09;参数&#xff08;3&#xff09;返回值&#xff08;4&#xff09;示例代码 2 . 等待信号量&#xff08;1&#xff09;sem_wait…

Stable Diffusion webui安装详细教程

上一篇文章介绍了sd主流的ui&#xff0c;相信大家已经有所了解&#xff0c;下面为大家介绍sd-webui的安装详细教程 文章目录 一、 安装包说明二、对电脑的要求三、安装文件介绍四、安装步骤五、电脑问题与云主机六、界面简要说明及通用反向提示词 一、 安装包说明 通常我们使…

手把手一起开发SV4E-I3C设备(一)

1、SV4E-I3C设备介绍 SV4E-I3C 是Introspect Technology基于 13C 的设备接口开发、测试和编程的全套解决方案。该设备集三种仪器于一身&#xff0c;可用作协议练习器、协议分析器和通用 I3C 器件编程器&#xff0c;设备实物图片如图所示&#xff1a; SV4E-I3C设备的物理连接如…

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn = 1e6 + 5, inf = 1e18 * 3, maxm = 4e4 + 5,…

Junit测试套件(Test Suite)

0. 什么是测试套件 对多个测试类的统一执行 只有一个测试类 点击一下执行就好有 5个测试类 分别打开 挨个点执行有100个测试类 &#xff1f;&#xff1f;分别点开执行 为100个测试类创建一个测试套件&#xff0c;然后再执行一次测试套件 √ 一个测试套件“囊括“三个测试类…

跟着pink老师前端入门教程(JavaScript)-day02

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

作业帮 x TiDB丨多元化海量数据业务的支撑

导读 作业帮是一家成立于 2015 年的在线教育品牌&#xff0c;致力于用科技手段助力教育普惠。经过近十年的积累&#xff0c;作业帮运用人工智能、大数据等技术&#xff0c;为学生、老师、家长提供学习、教育解决方案&#xff0c;智能硬件产品等。随着公司产品和业务场景越来越…

黑马程序员——移动Web——day03

目录&#xff1a; 移动Web基础 谷歌模拟器屏幕分辨率视口二倍图适配方案rem 简介媒体查询rem布局flexible.jsrem移动适配less 注释运算嵌套变量导入导出禁止导出综合案例-极速问诊 准备工作头部布局头部内容banner区域问诊类型布局问诊类型内容 1.移动 Web 基础 谷歌模拟器 …

软件实例分享,家具生产出库管理系统软件教程

软件实例分享&#xff0c;家具生产出库管理系统软件教程 一、前言 以下软件程序教程以 佳易王家具行业生产出库管理系统软件V16.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 销售管理——产品状态查询变更&#xff0c;可以根据生产进度变更…

每日OJ题_二叉树dfs①_力扣2331. 计算布尔二叉树的值

目录 力扣2331. 计算布尔二叉树的值 解析代码 力扣2331. 计算布尔二叉树的值 2331. 计算布尔二叉树的值 难度 简单 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示…

七天入门大模型 :来,亲手做一个AI应用!

内容提纲 七天入门大模型已完成了6篇&#xff0c;喜欢记得收藏、关注、点赞。 七天入门大模型 &#xff1a;LLM大模型基础知识最全汇总七天入门大模型 &#xff1a;提示词工程 Prompt Engineering&#xff0c;最全的总结来了&#xff01;七天入门大模型 &#xff1a;LLM和多模…

74HC373使用方法

74HC373属于D锁存器 OC&#xff1a;输出控制&#xff0c;低电平输出使能 LE&#xff1a;锁存使能输入&#xff0c;低电平直通&#xff0c;高电平锁存 Q&#xff1a;数据输出引脚 D&#xff1a;数据输入引脚

推荐系统|召回04_离散特征处理

离散特征处理 离散特征是什么 怎么处理离散特征 One-hot编码 Embedding嵌入 从one-hot到Embedding&#xff0c;已经节省了很多的存储空间&#xff0c;但当数据量大的时候&#xff0c;还是占空间&#xff0c;所以工业界仍会对Embedding进行优化 而一个物品所对应的Embedding参数…

使用Python编写脚本-根据端口号杀掉进程

我的GitHub&#xff1a;Powerveil - GitHub 我的Gitee&#xff1a;Powercs12 - Gitee 皮卡丘每天学Java 从前段开始遇到一个问题&#xff0c;服务在启动的时候总是端口被占用&#xff0c;发现还是Java程序&#xff0c;但是当时并没有启动Java程序&#xff0c;电脑出问题了。 一…

Vue项目-创建

Vue项目-创建 创建一个工程化的Vue项目&#xff0c;执行命令&#xff1a;npm init vuelatest 第一次执行npm init vuelatest命令&#xff0c;会出现以下提示&#xff0c;输入y即可安装create-vue最新版本。 随后create-vue脚手架会给出项目的众多选项 根据提示输入命令 cd…

WebServer 之 http连接处理(下)

目录 ✊请求报文--解析 流程图 && 状态机 状态机 -- 状态转移图 主状态机 从状态机 http 报文解析 HTTP_CODE 含义 从状态机 逻辑 主状态机 逻辑 &#x1f41e;请求报文--响应 基础API stat mmap iovec writev 流程图 HTTP_CODE 含义(2) 代码分析 …

CV | Segment Anything论文详解及代码实现

本文主要是详解解释了SAM的论文部分以及代码实现~ 论文&#xff1a;2023.04.05_Segment Anything 论文地址&#xff1a;2304.02643.pdf (arxiv.org) 代码地址&#xff1a;facebookresearch/segment-anything: The repository provides code for running inference with the Seg…

鲜为人知的python位运算

位运算&#xff0c;计算机内所有的数都以二进制存储&#xff0c;位运算就是对二进制位的操作 位运算符说明<<按位左移&#xff0c;左移n位相当于乘以2的n次方>>按位右移 &#xff0c;左移n位相当于除以2的n次方&按位与&#xff0c;二进制位数同且为1结果位为1…