|
|
def alu_op():
|
|
|
ALUop = dict()
|
|
|
for i in '+-x÷':
|
|
|
ALUop[i] = False
|
|
|
return ALUop
|
|
|
|
|
|
|
|
|
def alu_io():
|
|
|
ALUio = dict()
|
|
|
Register = ["R1", "R2", "R3", "R4"]
|
|
|
for reg in Register:
|
|
|
ALUio[f"{reg}_ALU_1"] = False
|
|
|
ALUio[f"{reg}_ALU_2"] = False
|
|
|
ALUio[f"ALU_{reg}"] = False
|
|
|
return ALUio
|
|
|
|
|
|
|
|
|
def clock_step():
|
|
|
ClockStep = dict()
|
|
|
for i in range(6):
|
|
|
ClockStep[str(i + 1)] = False
|
|
|
return ClockStep
|
|
|
|
|
|
|
|
|
def sig_obj():
|
|
|
SigObj = dict()
|
|
|
Register = ["R1", "R2", "R3", "R4", "IR"]
|
|
|
ctrl = ["ALU","ALU_1", "ALU_2", "PC+1", "Memory"]
|
|
|
for r in Register:
|
|
|
SigObj[f"Mcontent->{r}"] = [f"Mcontent->{r}", False, "DataSig"]
|
|
|
SigObj[f"->{r}"] = [f"->{r}", False, "CtrlSig"]
|
|
|
for ct in ctrl:
|
|
|
SigObj[f"->{ct}"] = [f"->{ct}", False, "CtrlSig"]
|
|
|
SigObj["IR->SigCtrl"] = ["IR->SigCtrl", False, "CtrlSig"]
|
|
|
SigObj["PC->Maddr"] = ["PC->Maddr", False, "DataSig"]
|
|
|
SigObj["IR->Maddr"] = ["IR->Maddr", False, "DataSig"]
|
|
|
SigObj["Memory->Mcontent"] = ["Memory->Mcontent", False, "DataSig"]
|
|
|
SigObj["Mcontent->PC"] = ["Mcontent->PC", False, "DataSig"]
|
|
|
SigObj["Mcontent->Memory"] = ["Mcontent->Memory", False, "DataSig"]
|
|
|
return SigObj
|
|
|
|
|
|
|
|
|
def sim_mem():
|
|
|
sim_mem_ls = []
|
|
|
for i in range(20):
|
|
|
sim_mem_ls.append(f"{0:016b}")
|
|
|
return sim_mem_ls
|
|
|
|
|
|
|
|
|
def bin_to_dec(binary_string, bit_width=16):
|
|
|
"""
|
|
|
将补码二进制字符串转换为有符号数10进制,处理溢出。
|
|
|
|
|
|
参数:
|
|
|
binary_string (str): 补码二进制字符串,例如 "1101100101101110"。
|
|
|
bit_width (int): 位宽,默认为16位。
|
|
|
|
|
|
返回:
|
|
|
int: 转换后的有符号数10进制。
|
|
|
"""
|
|
|
if len(binary_string) > bit_width:
|
|
|
# 如果二进制字符串长度超出位宽,截断超出部分
|
|
|
binary_string = binary_string[-bit_width:]
|
|
|
|
|
|
# 如果最高位为1,说明是负数,先取反再加1得到绝对值的原码
|
|
|
if binary_string[0] == '1':
|
|
|
inverted_string = ''.join('1' if bit == '0' else '0' for bit in binary_string)
|
|
|
absolute_value = -(int(inverted_string, 2) + 1)
|
|
|
else:
|
|
|
# 如果最高位是0,则直接转换为正数
|
|
|
absolute_value = int(binary_string, 2)
|
|
|
|
|
|
return absolute_value
|
|
|
|
|
|
|
|
|
def dec_to_bin(decimal_value, bit_width=16):
|
|
|
"""
|
|
|
将有符号数10进制转换为补码二进制字符串,处理溢出。
|
|
|
|
|
|
参数:
|
|
|
decimal_value (int): 有符号数10进制。
|
|
|
bit_width (int): 位宽,默认为16位。
|
|
|
|
|
|
返回:
|
|
|
str: 转换后的补码二进制字符串。
|
|
|
"""
|
|
|
# 如果输入数据超出位宽,截断超出部分
|
|
|
decimal_value = decimal_value & ((1 << bit_width) - 1)
|
|
|
|
|
|
# 如果是负数,获取其绝对值的原码
|
|
|
if decimal_value < 0:
|
|
|
absolute_value_binary = bin(abs(decimal_value))[2:]
|
|
|
|
|
|
# 如果位数不足,需要在左侧补0
|
|
|
if len(absolute_value_binary) < bit_width:
|
|
|
absolute_value_binary = '0' * (bit_width - len(absolute_value_binary)) + absolute_value_binary
|
|
|
|
|
|
# 对绝对值的原码进行按位取反
|
|
|
inverted_representation = ''.join('1' if bit == '0' else '0' for bit in absolute_value_binary)
|
|
|
|
|
|
# 将取反后的二进制表示加上1,得到补码表示
|
|
|
binary_representation = format(int(inverted_representation, 2) + 1, f'0{bit_width}b')
|
|
|
else:
|
|
|
# 如果是正数,直接转换为二进制
|
|
|
binary_representation = bin(decimal_value)[2:]
|
|
|
|
|
|
# 如果位数不足,需要在左侧补0
|
|
|
if len(binary_representation) < bit_width:
|
|
|
binary_representation = '0' * (bit_width - len(binary_representation)) + binary_representation
|
|
|
|
|
|
return binary_representation
|
|
|
|
|
|
|
|
|
ALUio = alu_io()
|
|
|
ALUop = alu_op()
|
|
|
ClockStep = clock_step()
|
|
|
SigObj = sig_obj()
|
|
|
SimMem = sim_mem()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
ALUio = alu_io()
|
|
|
print(ALUio)
|
|
|
ALUop = alu_op()
|
|
|
print(ALUop)
|
|
|
ClockStep = clock_step()
|
|
|
print(ClockStep)
|
|
|
SigObj = sig_obj()
|
|
|
print(SigObj)
|
|
|
SimMem = sim_mem()
|
|
|
print(SimMem)
|
|
|
|
|
|
|