常见Verilog运算符(逻辑运算符、按位运算符、缩位运算符、迭代连接运算符、移位运算符)

本文详细介绍了Verilog中的逻辑运算符(如&&, ||, !)、按位运算符(如&,|,~)、缩位运算符的使用,以及{}迭代连接运算符和逻辑移位、数字移位运算符(如<<, >>)。通过实例展示了如何使用这些运算符,并强调了在使用过程中需要注意的细节,包括迭代连接运算符在常量操作中的应用和integer类型的位宽问题。" 133674861,19694720,微控制器中的TCON寄存器:功能与编程实践,"['单片机', '嵌入式硬件', '编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Verilog逻辑运算符与按位运算符:

区别:按位运算符进行逐位的逻辑运算(如:与或非),输出与输入位数一致;
           逻辑运算符进行逻辑运算,不关注输入的某一位而是将输入作为整体进行逻辑操作,输出位数为1;

列举:
        与:& 按位与;&& 逻辑与;
        或:|  按位或;||    逻辑或;
        非:~ 按位非;!  逻辑非;

缩位运算符:

灵活使用缩位运算符,可以简化代码,避免重复工作;

如:
     &a  可实现a各位间的与运算,即:&a等价于 a(0)&a(1)&...&a(n)    

     | a  可实现a各位间的或运算,即:| a等价于 a(0)|a(1)|...|a(n)

{}迭代连接运算符:

连接功能:将若干个寄存器类型/线网类型的变量首尾连接,形成一个更大位宽的变量;
    如:

        a = 2'b10;

        b = 3'b010;

       有{a,b} = 5'b10010;

迭代功能:把一个变量复制多次,首尾连接组成一个更

### C++ 中获取当前可执行文件路径的方法 在 C++ 编程中,获取当前可执行文件的路径可以通过多种方法实现。以下是几种常见的技术: #### 使用 `/proc/self/exe` 的方法 在 Linux 平台上,可以利用操作系统提供的特殊符号链接 `/proc/self/exe` 来获取当前可执行文件的具体位置。这种方法被认为是最可靠和最简单的解决方案之一[^1]。 ```cpp #include <unistd.h> #include <limits.h> std::string getExecutablePath() { char path[PATH_MAX]; ssize_t count = readlink("/proc/self/exe", path, sizeof(path) - 1); if (count != -1) { path[count] = '\0'; return std::string(path); } return ""; } ``` 此代码片段展示了如何通过 `readlink()` 函数解析 `/proc/self/exe` 链接并返回完整的可执行文件路径。 --- #### 利用 `argv[0]` 另一种常见的方式是从程序启动参数中的 `argv[0]` 提取可执行文件名或路径。需要注意的是,这种方式可能仅提供相对路径或者不带任何路径信息的情况,因此其可靠性较低。 ```cpp #include <iostream> #include <cstdlib> void printExecutableName(char * argv[]) { std::cout << "Executable name/path: " << argv[0] << std::endl; } int main(int argc, char * argv[]) { printExecutableName(argv); return EXIT_SUCCESS; } ``` 上述例子演示了如何直接打印传入到主函数的命令行参数的第一个值作为可执行文件名称/路径。 --- #### 调用 `getcwd()` 获取工作目录 虽然严格来说这不是一种获得 **可执行文件** 路径的办法,但是有时候我们需要知道进程的工作目录以便进一步处理其他资源定位逻辑。这里给出基于 POSIX 标准库的一个示例来展示怎样取得当前工作的绝对路径[^2]: ```cpp #include <stdio.h> #include <stdlib.h> #include <errno.h> char* getCurrentWorkingDirectory() { char* buffer = nullptr; size_t size = 0; errno = 0; buffer = getcwd(nullptr, 0); // Let the system allocate memory automatically. if (!buffer && errno != 0){ perror("Error retrieving current working directory"); exit(EXIT_FAILURE); } printf("Current Working Directory:%s\n", buffer); free(buffer); // Free allocated resources after use. return buffer; } ``` 注意该版本会自动分配足够的空间存储结果字符串,并且记得释放动态申请的空间以防泄漏。 --- #### Windows 特定 API `_pgmptr` 如果目标平台是 Microsoft Windows,则可以直接访问全局变量 `_pgmptr` ,它包含了指向可执行映像全限定路径的指针[^3] 。下面是一个跨平台兼容的例子: ```cpp #ifdef _WIN32 #include <tchar.h> #else #define _T(x) x #endif std::string getExeFilePathCrossPlatform(){ #ifdef _WIN32 return std::_tcsdup(_pgmptr); #else char result[ PATH_MAX ]; ssize_t count = ::readlink( "/proc/self/exe", result, PATH_MAX ); return std::string(result, (count > 0) ? count : 0 ); #endif } ``` 这个宏定义允许我们编写一次代码就能适应不同操作系统的特性差异。 --- ### 总结 每种方法都有各自的适用场景与局限性,在开发过程中应当依据项目需求选取恰当的技术手段完成任务。例如,当追求最高精度时推荐采用读取 `/proc/self/exe`;而对于某些特定环境下或许借助于 `argv[0]` 就已经足够满足基本功能诉求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值