小编Shr*_*yas的帖子

Verilog中的有符号乘法溢出检测

初学者在这里.我正在尝试在Verilog中编写一个简单的16位微处理器,并在Spartan 6上实现它.ALU实现所有已签名的操作(根本没有未签名的操作).所有输入都是电线并已签名.结果存储在带符号的寄存器中.

我的问题是找到一种检测溢出的合理方法.目前检测溢出的速度并不重要,因为它只会触发故障并停止系统.

我相信我已经弄清楚如何在加法和减法中检测出溢出,但无论如何我还是要保证.

这是另外的,其中o是溢出标志寄存器:

if((a_in >= 0) && (b_in >= 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in < 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;
Run Code Online (Sandbox Code Playgroud)

这是减法:

if((a_in >= 0) && (b_in < 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in > 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;
Run Code Online (Sandbox Code Playgroud)

控制矩阵负责a_in和b_in的保持时间,以便溢出检测可以完成,因为只有在计算结果后才会完成(在下一个时钟周期).

我做了一些环顾四周,我发现的所有内容都是检测其他语言的溢出,如C或C++.我正在寻找有符号乘法中检测溢出的示例实现.

输入a_in和b_in均为带符号线,宽度为16位.结果寄存器res_out是有符号的,也是16位宽.理想情况下,我有一个33位宽的结果寄存器,无论如何都不会发生溢出,但这不是一个选项.

感谢帮助.任何更好的方法来检测加法和减法中的溢出也是受欢迎的.

verilog

5
推荐指数
1
解决办法
9608
查看次数

C++中64位整数的Bitwise(Bitshift)操作

我正在尝试处理位板,这需要我在64位无符号整数中设置一个特定的位.要设置位i,我对所讨论的位板执行按位OR运算,左移数字.

#include <stdint.h>
uint64_t kings = 0ULL; // Also tried unsigned long long int before.
kings |= 1 << i;
Run Code Online (Sandbox Code Playgroud)

它从第0位到第31位工作正常,但不能用于第32位到第63位.我怀疑这是因为右侧的评估恰好是32位整数.因此,我尝试了一个临时变量.

uint64_t temp = 0ULL;
temp |= 1 << i;
Run Code Online (Sandbox Code Playgroud)

也许它仍然将右侧评估为32位整数,或者它是我无法弄清楚的其他问题.要输出整数,我使用的是std :: bitset <64>.例如:

uint64_t kings = 0ULL;
kings |= 1 << 3;
kings |= 1 << 59;
Run Code Online (Sandbox Code Playgroud)

预期小数值:576460752303423496

实际:8

std::bitset<64> x(kings);
std::cout << x;
Run Code Online (Sandbox Code Playgroud)

位值:0000000000000000000000000000000000000000000000000000000000001000

显然,只有国王| = 1 << 3; 工作正常.

总之,第32到63位有什么问题,我该如何解决?

c++ bit-manipulation bit-shift bitwise-or bitboard

5
推荐指数
2
解决办法
8333
查看次数

区分同一类型的多个异常

我无法完全理解用户如何能够区分我的函数可以抛出的异常.我的一个函数可以抛出两个实例std::invalid_argument.

例如,在构造函数中:

#include <stdexcept> // std::invalid_argument
#include <string>

class Foo
{
public:
    void Foo(int hour, int minute)
    :h(hour), m(minute)
    {
        if(hour < 0 || hour > 23)
            throw std::invalid_argument(std::string("..."));
        if(minute < 0 || minute > 59)
            throw std::invalid_argument(std::string("..."));
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这是一个例子,请不要用有界整数回答.

假设用户调用foo(23, 62);,用户的异常处理程序如何区分两个可能的实例std::invalid_argument

或者我做错了,我应该继承std :: invalid_argument来区分它们吗?那是,

class InvalidHour: public std::invalid_argument
{
public:
    InvalidHour(const std::string& what_arg)
    :std::invalid_argument(msg) {};
}

class InvalidMinute: public std::invalid_argument
{
public:
    InvalidMinute(const std::string& what_arg)
    :std::invalid_argument(msg) {};
}
Run Code Online (Sandbox Code Playgroud)

然后,扔InvalidHourInvalidMinute …

c++ exception-handling exception c++11

5
推荐指数
1
解决办法
228
查看次数