初学者在这里.我正在尝试在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位宽的结果寄存器,无论如何都不会发生溢出,但这不是一个选项.
感谢帮助.任何更好的方法来检测加法和减法中的溢出也是受欢迎的.
我正在尝试处理位板,这需要我在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位有什么问题,我该如何解决?
我无法完全理解用户如何能够区分我的函数可以抛出的异常.我的一个函数可以抛出两个实例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)
然后,扔InvalidHour和InvalidMinute …