使 PicoBlaze 组件中的摄氏度到华氏度转换器能够支持更广泛的可能输入

问题描述 投票:0回答:1

我制作了一个简短的 PicoBlaze 汇编程序,使用公式

Fahrenheit=(Celsius*9/5)+32

将使用 8 个开关(输入 0)输入的摄氏度转换为华氏度,并将其输出到 8 个 LED(输出 0)上
;Let's say Celsius is on input 0
;and you are supposed to output
;Fahrenheit on output 0.

address 0
input s0, 0
load s1, 0
load s2, 9
multiplication_by_9:
add s1, s0
sub s2, 1
jump nz, multiplication_by_9
load s2, 0
division_by_5:
add s2, 1
sub s1, 5
jump nc, division_by_5
add s2, 32'd
output s2, 0
jump 0

现在,如果您使用开关输入

00010010
(二进制 18),它会输出
01000001
(二进制 65),它接近右侧。如果您输入
00010110
(22 的二进制),它将输出
01001000
(72 的二进制),这再次接近右侧。

但是,如果输入

00100101
(二进制 37),则会发生溢出并输出
00110000
(二进制 48),这与正确答案相差甚远。

那么,在这种情况下我怎样才能让它输出接近正确答案的东西呢?

assembly integer-overflow picoblaze
1个回答
0
投票

有多种选择。

最直接的方法是将代码升级为 16 位算术。在 picoblaze 上,这意味着为累加器使用 2 个寄存器,并进行两次 8 位加法,每个加法一次,并且还对高 8 位累加器寄存器使用带进位的加法来完成 16 位加法。对于除法,picoblaze 也有带进位的减法。这将是准确且相对简单的。

除以 5 时避免长循环的另一种选择是乘以 1.8,这里也使用 16 位算术,但不是用于低字节和高字节的寄存器,而是有寄存器,一个用于整数部分,一个用于整数部分小数部分。我们将 1.8 近似为以下 x + x(2^-1) + x(2^-2) + x(2^-6) + x(2^-7),这给我们 1.796875x。或者再添加一项 x(2^-9), 1.800781x。每一项都是除以 2 的某个幂,这意味着可以使用移位来完成。小数部分对于捕获很重要,因为它们将相加并告知整数部分。在这台机器上,它的指令序列会有点复杂,因为它一次只能移位 1 位,但我们可以重用中间结果,例如 2^-1(右移 1 位),我们可以再移动一位即可得到 2^-2 项。这里使用带有进位的加法(如 16 位加法)也是必要的(尽管由于乘法已经包括 9/5,所以不需要进一步除法)。

© www.soinside.com 2019 - 2024. All rights reserved.