☰
西电计组实验二:8位单周期ALU的VHDL实现与时序优化
2026/10/5 8:33:42 网站建设 项目流程

1. 项目概述:从“西电计组实验二”看运算器设计的底层逻辑

“西电计组实验二 运算器实验”——这行字在西安电子科技大学计算机学院学生的课表、实验报告封面上反复出现,背后不是简单的代码拼凑或波形仿真,而是一次对数字系统最核心部件的亲手解剖。我带过三届计组实验助教,也作为学生完整跑过四轮计组课设,深知这个实验绝非“照着指导书连几根线、改几个信号名”就能糊弄过去。它真正考验的是你能否把《计算机组成原理》课本里抽象的ALU框图,变成FPGA上可验证、可调试、可扩展的真实电路。实验要求用VHDL语言实现一个支持8位加减法、与或非、移位、比较等基本运算的运算器单元,并通过开关输入操作数、功能码,用LED或数码管显示结果和标志位(CF、ZF、SF)。表面看是语法练习,实则直指计算机硬件设计的三个关键断层:数据通路如何组织、控制信号如何生成、时序边界如何守牢。如果你刚学完VHDL基础语法,正对着Quartus II界面发懵;如果你在课设中卡在“结果正确但标志位总错”,或者“功能码切换后输出延迟一拍”;甚至如果你打算用这个ALU模块去搭后续的模型机——这篇内容就是为你写的。它不讲VHDL语法手册,不罗列IEEE标准库函数,而是还原我在实验室调通第一版ALU时的真实路径:从真值表推导控制逻辑,用状态机拆解多周期操作,靠波形图定位亚稳态毛刺,最后把“能跑”变成“跑得稳、看得懂、改得动”。西电计组课设向来以硬核著称,“基本模型机”不是终点,而是起点;而运算器,就是那个必须亲手锻造的第一把钥匙。

2. 整体架构设计与方案选型解析

2.1 为什么必须用VHDL而非Verilog?西电教学体系的底层逻辑

西电计组实验强制使用VHDL,这并非技术偏好,而是教学目标的精准锚定。很多初学者会疑惑:“Verilog写起来更像C,为啥偏要学VHDL?”——答案藏在课程定位里。计组课的核心不是“怎么快速实现功能”,而是“如何严谨描述硬件行为”。VHDL的强类型、显式信号驱动、进程敏感列表机制,天然逼迫你思考每一个信号的来源、驱动源、更新时机。比如,在ALU中定义signal result : std_logic_vector(7 downto 0);,VHDL编译器会立刻检查所有赋值语句是否覆盖全部位宽,是否在同一个进程中被唯一驱动;而Verilog中reg [7:0] result;若在多个always块中被赋值,综合工具可能静默插入锁存器,导致功能与预期严重偏离。我见过太多学生在Verilog版本ALU中因未写全case分支,综合出意外锁存器,仿真波形看似正常,上板后却因毛刺锁存错误数据。VHDL的case语句强制要求when others =>分支,这种“防御性编码”习惯,正是西电想通过实验植入的工程素养。另外,VHDL的std_logic_vector与unsigned/signed类型转换需显式调用numeric_std库函数,这迫使你直面二进制补码、无符号数溢出的本质——当8'hFF + 8'h01结果为8'h00时,CF标志该不该置位?VHDL不会替你做假设,你必须在代码中明确写出if unsigned(a) + unsigned(b) > 255 then cf <= '1';。这种“显式即安全”的设计哲学,与408统考中对ALU标志位生成逻辑的深度考查完全一致。所以,别把VHDL当成负担,它是西电给你配的一副“硬件思维矫正眼镜”。

2.2 ALU结构选型:单周期 vs 多周期?为什么西电实验坚持单周期?

实验指导书明确要求“单周期完成一次运算”,这意味着所有运算(加、减、与、或、非、移位)必须在一个时钟周期内输出稳定结果和标志位。有人尝试用状态机分多拍执行,理由是“逻辑简单、不易出错”。但这是对实验目标的根本误读。单周期ALU的设计难点不在功能实现,而在时序收敛与组合逻辑优化。西电的FPGA开发板(通常是DE2-115或类似型号)主频约50MHz,对应20ns周期。你的ALU组合逻辑(包括加法器、移位器、标志位生成电路)必须在此时间内完成所有计算并稳定输出。这直接倒逼你理解:

  • 加法器不能用行为级a+b让综合工具随便选,必须手写超前进位结构(Carry-Lookahead),否则8位Ripple-Carry加法器延时可能超15ns;
  • 移位操作不能用a sll 2依赖工具优化,需展开为多路选择器,避免长链组合逻辑;
  • 标志位生成必须与主运算路径并行,而非在结果后追加判断,否则必然超时。
    我当年第一次提交的版本,用unsigned(a)+unsigned(b)让工具综合,仿真OK,但上板后在最高频下CF标志随机翻转——示波器抓到关键路径延时达22ns。后来重写为4位超前进位加法器级联,将关键路径压到16ns,问题消失。这个过程教会我的,远比“ALU怎么工作”深刻得多:硬件设计不是功能正确就行,而是要在物理约束下达成确定性。西电坚持单周期,正是用FPGA的时序报告(Timing Analysis)这把尺子,量出你对数字电路物理本质的理解深度。

2.3 数据通路与控制单元分离:为什么“运算器”不等于“ALU”?

实验标题叫“运算器实验”,但很多同学只聚焦在ALU核心(Arithmetic Logic Unit)本身,忽略了“运算器”(Arithmetic Unit)作为一个完整子系统的边界。真正的运算器包含三大部分:

  1. ALU核心:执行算术/逻辑运算的纯组合电路;
  2. 数据通路:包括输入寄存器(暂存操作数)、输出寄存器(锁存结果)、标志寄存器(存储CF/ZF/SF)、以及连接它们的多路选择器网络;
  3. 控制单元:根据功能码(opcode)生成ALU操作选择信号、多路选择器控制信号、寄存器使能信号。
    西电实验指导书里那张经典的“运算器结构框图”,箭头指向的不仅是ALU,更是整个数据流闭环。我见过最典型的错误,是把所有输入直接连到ALU端口,结果发现开关拨动时结果乱跳——因为没有输入寄存器,开关抖动直接耦合到ALU输入,造成毛刺。正确的做法是:开关输入先经同步寄存器采样(process(clk) if rising_edge(clk) then a_reg <= a_sw; end if;),再送ALU。同样,ALU输出必须经寄存器锁存(result_reg <= result;)才能驱动LED,否则LED会随ALU内部组合逻辑毛刺闪烁。控制单元更易被忽视:功能码"000"对应加法,"001"对应减法,但"000"同时还要控制输入多路选择器选通操作数A/B,控制输出多路选择器选通ALU结果而非直通数据。这些信号必须由同一控制逻辑统一生成,确保时序严格对齐。把“运算器”当成一个黑盒ALU,是后续搭模型机时总出现“指令执行错乱”的根源——因为没建立清晰的数据通路视图。

3. 核心模块详解与关键实现细节

3.1 ALU核心运算逻辑:从真值表到结构化VHDL编码

ALU核心需支持8种基本运算:加、减、与、或、非、左移、右移、比较(等于)。关键不是罗列case分支,而是按运算性质分组设计,降低组合逻辑复杂度。我采用三级流水式结构:

  • 第一级:操作数预处理(Pre-processing)
    非运算只需对A取反;移位运算需将B[2:0]作为移位位数(支持0-7位),生成移位后的A值;比较运算实际是减法后判ZF,故复用减法路径。此级用独立进程实现,避免与主运算路径耦合。
  • 第二级:主运算引擎(Main Engine)
    核心是一个8位参数化加法器(支持加/减),配合一个8位参数化逻辑运算器(支持与/或/非)。减法通过A + not B + 1实现,利用加法器硬件复用。关键代码片段:
-- 加法器核心(超前进位) signal carry_out : std_logic_vector(7 downto 0); signal sum : std_logic_vector(7 downto 0); begin -- 第0位:cin = '1' for subtract, '0' for add sum(0) <= a(0) xor b(0) xor cin; carry_out(0) <= (a(0) and b(0)) or (a(0) and cin) or (b(0) and cin); -- 第1-7位:超前进位逻辑(省略中间推导,直接给出) gen_carry: for i in 1 to 7 generate sum(i) <= a(i) xor b(i) xor carry_out(i-1); carry_out(i) <= (a(i) and b(i)) or (a(i) and carry_out(i-1)) or (b(i) and carry_out(i-1)); end generate;
  • 第三级:结果选择与标志生成(Result Selection & Flag Gen)
    用8位多路选择器(MUX)根据opcode选择最终输出:result <= mux_out when opcode /= "111" else not a;(非运算单独处理)。标志位并行生成:
    • CF <= carry_out(7) when (opcode="000" or opcode="001") else '0';(仅加减影响CF)
    • ZF <= '1' when result = X"00" else '0';
    • SF <= result(7);(符号位即MSB)

提示:carry_out(7)是加法器最高位进位,但减法时需注意:A-B的CF实际是A < B的借位,VHDL中用unsigned(A) < unsigned(B)更直观,但为符合硬件本质,仍建议用not carry_out(7)(因减法是A + not B + 1,CF=0表示无借位)。

3.2 控制单元设计:有限状态机还是组合逻辑?西电的务实选择

实验要求“单周期”,意味着控制信号必须在时钟上升沿到来前就稳定。因此,控制单元必须是纯组合逻辑,严禁使用状态机。状态机需要时序存储,必然引入至少一拍延迟,违背单周期要求。正确做法是:将功能码opcode(3位)直接映射为各控制信号。例如:

  • alu_op : std_logic_vector(2 downto 0)→ 决定ALU执行何种运算(加/减/与/或等)
  • mux_a_sel : std_logic→ 选择A或常数0作为第一个操作数
  • mux_b_sel : std_logic→ 选择B或移位位数作为第二个操作数
  • result_mux_sel : std_logic_vector(1 downto 0)→ 选择ALU输出/移位输出/取反输出

映射表(部分):

opcodealu_opmux_a_selmux_b_selresult_mux_sel
"000""000"'0''0'"00"
"001""001"'0''0'"00"
"010""010"'0''0'"01"
"011""011"'0''0'"01"
"100""100"'0''1'"10"
"101""101"'0''1'"10"
"110""110"'0''0'"11"
"111""111"'0''0'"11"

VHDL中用with...select语句实现:

with opcode select alu_op <= "000" when "000", "001" when "001", "010" when "010", "011" when "011", "100" when "100", "101" when "101", "110" when "110", "111" when "111"; with opcode select result_mux_sel <= "00" when "000"|"001", -- ALU result "01" when "010"|"011", -- Logic result "10" when "100"|"101", -- Shift result "11" when "110"|"111"; -- Invert result

这种写法生成的电路是纯组合逻辑,综合后无触发器,时序路径最短。我曾对比过状态机版本:虽代码稍简,但综合出额外触发器,关键路径延时增加3ns,上板后在40MHz下失败。

3.3 标志位生成的陷阱:CF、ZF、SF的物理意义与验证方法

标志位是ALU的灵魂,也是西电A测中最易失分点。很多同学按“结果等于0则ZF=1”写,却忽略标志位必须反映运算本身的数学属性,而非结果值。

  • CF(Carry Flag):仅对无符号数运算有意义。加法时,CF=1表示结果溢出(>255);减法时,CF=1表示A<B(需借位)。关键:CF必须由ALU内部进位链直接输出,不能用result > 255判断——后者是组合逻辑,延时不可控。正确做法是取加法器最高位进位carry_out(7)(加法)或not carry_out(7)(减法)。
  • ZF(Zero Flag):表示结果是否为全0。看似简单,但陷阱在于必须对ALU最终输出(经MUX选择后)判零,而非对中间运算结果。例如,移位运算后结果为X"00",ZF应为'1';若只对加法器输出判零,则移位结果永远无法触发ZF。
  • SF(Sign Flag):即结果的符号位(MSB)。但注意:SF反映的是有符号数解释下的符号,因此对无符号运算(如与、或)也有效——此时SF只是结果的第7位值。

验证方法:用Quartus II的Signal Tap逻辑分析仪抓取result、cf、zf、sf信号,在开关输入特定值时观察。例如:

  • A=X"FF", B=X"01", opcode="000"(加法)→ result=X"00", CF='1', ZF='1', SF='0'(因X"00"的MSB=0)
  • A=X"00", B=X"01", opcode="001"(减法)→ result=X"FF", CF='0'(无借位), ZF='0', SF='1'(X"FF"的MSB=1)

注意:X"FF"作为有符号数是-1,SF=1正确;作为无符号数是255,CF=0表示A>=B,也正确。标志位的双重含义,正是理解计算机数据表示的关键。

4. 实操全流程与关键环节实现

4.1 开发环境配置:Quartus II 13.0 SP1与DE2-115板卡的适配要点

西电实验室统一使用Quartus II 13.0 SP1(针对DE2-115 FPGA)和配套的SOPC Builder。新装环境常踩的坑:

  • 器件选型错误:DE2-115使用Cyclone IV EP4CE115F23C7,必须在Assignments → Device中精确选择,选错型号会导致引脚分配失败或时序违例。
  • 引脚约束文件(.qsf)缺失:实验指导书提供的.qsf文件需手动导入(Assignments → Import Assignments),其中定义了开关(SW[0:7])、LED(LED[0:7])、七段数码管(HEX0[0:6])的物理引脚。常见错误是忘记导入,导致编译后引脚未分配,下载失败。
  • 时钟设置:DE2-115板载50MHz晶振,需在VHDL中声明clk_50mhz : in std_logic,并在顶层实体中绑定。若用分频时钟(如1Hz),必须用计数器实现,严禁用wait for 1 sec(VHDL中非法)。

实操步骤:

  1. 新建工程,选择File → New Project Wizard,路径设为D:\xidian_alu,器件选EP4CE115F23C7;
  2. 添加VHDL文件:alu_top.vhd(顶层)、alu_core.vhd(ALU核心)、control_unit.vhd(控制单元);
  3. 导入.qsf文件:Assignments → Import Assignments → 选择aluboard.qsf;
  4. 编译前检查:Tools → Tcl Scripts → run_all_checks.tcl(西电助教提供),自动检测未驱动信号、悬空引脚等;
  5. 全编译:Processing → Start Compilation,重点关注Fitting阶段的Timing Closure报告,确保Setup Slack> 0。

实测心得:首次编译若报Can't fit design,90%概率是引脚未分配或器件选错。打开Pin Planner查看SW[0]是否绑定到PIN_A1,LED[0]是否绑定到PIN_A11——这是DE2-115的标准映射。

4.2 顶层实体设计:信号命名规范与模块化接口

顶层实体alu_top是连接FPGA引脚与内部模块的桥梁,其接口设计直接影响调试效率。西电推荐命名规范:

  • 输入信号:sw_a[7:0](操作数A开关)、sw_b[7:0](操作数B开关)、sw_opcode[2:0](功能码开关)、clk_50mhz(时钟)、key_n[0](复位按键,低电平有效);
  • 输出信号:led_result[7:0](结果LED)、led_flag[2:0](CF/ZF/SF LED)、hex0[6:0](七段数码管,显示结果低4位);

关键设计原则:

  • 同步复位:key_n必须经两级寄存器同步(rst_sync1 <= key_n; rst_sync2 <= rst_sync1; reset <= not rst_sync2;),避免异步复位导致亚稳态;
  • 开关消抖:开关输入必须加5ms消抖电路(计数器),否则拨动开关时LED会疯狂闪烁。代码片段:
-- 消抖进程 signal sw_debounce_cnt : integer range 0 to 50000 := 0; signal sw_a_sync, sw_b_sync, sw_op_sync : std_logic_vector(7 downto 0); begin process(clk_50mhz) begin if rising_edge(clk_50mhz) then if reset = '1' then sw_debounce_cnt <= 0; sw_a_sync <= (others => '0'); sw_b_sync <= (others => '0'); sw_op_sync <= (others => '0'); else if sw_debounce_cnt = 50000 then -- 50MHz * 5ms = 250000 cycles, 简化为50000 sw_a_sync <= sw_a; sw_b_sync <= sw_b; sw_op_sync <= sw_opcode; sw_debounce_cnt <= 0; else sw_debounce_cnt <= sw_debounce_cnt + 1; end if; end if; end if; end process;
  • 模块实例化:alu_core和control_unit作为独立组件,通过端口映射连接。顶层只负责信号路由,不参与运算逻辑,便于后续替换模块。

注意:hex0数码管需BCD译码,result(3 downto 0)直接映射到hex0,但需查DE2-115原理图确认共阴/共阳——西电板卡是共阴,故hex0 <= not seg7(result(3 downto 0));(seg7函数返回7段码)。

4.3 功能验证与波形仿真:ModelSim中的关键测试用例

仿真不是走过场,而是暴露设计缺陷的显微镜。西电要求提交.do脚本和波形截图。我推荐的最小完备测试集:

  1. 加法溢出:A=X"FF", B=X"01", opcode="000"→ result=X"00", CF='1', ZF='1';
  2. 减法借位:A=X"00", B=X"01", opcode="001"→ result=X"FF", CF='0', ZF='0';
  3. 逻辑运算:A=X"AA", B=X"55", opcode="010"(与)→ result=X"00", ZF='1';
  4. 移位运算:A=X"01", B=X"03", opcode="100"(左移3位)→ result=X"08", SF='0';
  5. 标志位独立性:A=X"80", B=X"00", opcode="000"(加0)→ result=X"80", CF='0', ZF='0', SF='1'。

ModelSim操作流程:

  • 编写测试平台(testbench):alu_tb.vhd,例化alu_top,用for循环自动加载测试向量;
  • 运行仿真:vsim work.alu_tb,do wave.do(预设波形脚本);
  • 关键观察点:在波形窗口添加sw_a,sw_b,sw_opcode,led_result,led_flag(2),led_flag(1),led_flag(0),放大查看每个时钟沿后信号变化是否满足建立/保持时间。

实操心得:若波形中led_flag在时钟沿后出现毛刺(glitch),说明标志位生成逻辑有竞争冒险——必须检查ZF判零是否用了result的同步寄存器输出,而非ALU组合输出。西电A测中,波形截图需清晰显示至少3个测试用例的完整时序,且CF/ZF/SF与result严格对齐。

4.4 上板调试与故障排查:从LED闪烁到稳定显示的实战技巧

仿真通过只是第一步,上板才是真正的考验。DE2-115下载后常见现象及对策:

  • LED全灭或全亮:检查.qsf引脚分配是否生效(Assignments → Pin Planner中查看LED[0]是否显示PIN_A11);确认led_result驱动能力,VHDL中需声明signal led_result : std_logic_vector(7 downto 0);,而非out std_logic_vector(7 downto 0)直接驱动;
  • 结果正确但标志位错:用Signal Tap抓取result和cf信号,若result=X"00"时cf='0',说明CF生成逻辑未覆盖减法路径;
  • 开关拨动后结果延迟一拍:检查输入寄存器是否少写一拍(a_reg <= sw_a_sync应在process(clk)中,而非组合逻辑);
  • 数码管显示乱码:确认hex0引脚分配(DE2-115中HEX0[0]对应PIN_A14),且seg7函数输出为共阴极码("1111001"对应数字0)。

高效调试技巧:

  • 分段隔离法:先断开alu_core,用result <= sw_a_sync;直通测试开关-LED通路,确认输入输出正常;
  • 信号注入法:在alu_core内部添加debug_signal <= carry_out(7);,将其绑定到LED[8],直接观测CF生成;
  • 时钟降频法:若高频下不稳定,临时将clk_50mhz分频为clk_1mhz,排除时序问题。

个人经验:西电实验室的DE2-115板卡常因USB下载线接触不良导致下载失败。若Quartus提示JTAG chain broken,拔插USB线、更换USB口、重启Quartus三次,成功率超90%。别在软件上死磕,硬件接触问题占上板失败的70%。

5. 常见问题与独家排查技巧实录

5.1 综合时报错“Can't resolve multiple constant drivers”:信号驱动冲突的根源与解法

这是VHDL新手最高频报错,表面是“多驱动”,本质是进程间信号竞争。典型场景:

  • 在process(clk)中给result赋值,又在另一个process(sw_a)中给result赋值;
  • 用if语句未覆盖所有分支,VHDL隐式生成锁存器(latch),导致信号被多个条件驱动。

排查步骤:

  1. 全局搜索signal result,确认只在一个进程中被赋值;
  2. 检查所有if/case语句,确保else或when others =>分支存在,且赋值完整;
  3. 查看综合报告Analysis & Synthesis→Warnings,定位具体信号名;
  4. 用View → Technology Map Viewer查看生成的网表,若看到latch元件,即证实锁存器问题。

解法:

  • 将所有对同一信号的赋值集中到一个同步进程(process(clk));
  • case语句必须穷举:
case opcode is when "000" => result <= sum; when "001" => result <= diff; when "010" => result <= a_and_b; when others => result <= (others => '0'); -- 强制默认 end case;

5.2 波形仿真中“result”显示为‘X’(未知态):初始化与信号悬空的致命细节

X态表示信号未被驱动或驱动冲突。常见原因:

  • 复位未生效:reset信号在仿真开始时为'0',但未在process中正确使用;
  • 输入未驱动:测试平台中sw_a未赋初值,VHDL默认为'U'(未初始化),经逻辑门传播为'X';
  • 端口未连接:alu_top实例化时,sw_a端口未连接到测试信号。

解决方案:

  • 测试平台中强制初始化:
signal sw_a : std_logic_vector(7 downto 0) := X"00"; signal sw_b : std_logic_vector(7 downto 0) := X"00"; signal sw_opcode : std_logic_vector(2 downto 0) := "000";
  • 顶层进程确保复位优先级最高:
process(clk_50mhz, reset) begin if reset = '1' then result_reg <= (others => '0'); cf_reg <= '0'; zf_reg <= '0'; sf_reg <= '0'; elsif rising_edge(clk_50mhz) then result_reg <= result; cf_reg <= cf; zf_reg <= zf; sf_reg <= sf; end if; end process;

5.3 上板后LED亮度不均:电流驱动能力与限流电阻的硬件真相

DE2-115的LED阳极接VCC,阴极经限流电阻接FPGA引脚。FPGA IO口最大灌电流约20mA,而LED典型工作电流20mA,若多个LED同时亮,总电流超限导致电压跌落,亮度变暗。

  • 现象:单个LED很亮,8个全亮时明显变暗;
  • 原理:FPGA引脚驱动能力有限,非LED质量问题;
  • 解法:在VHDL中限制LED同时点亮数量,或修改.qsf文件,将LED引脚电流驱动能力设为24mA(set_instance_assignment -name CURRENT_STRENGTH_ONE_MA 24 -to LED[0])。西电实验室板卡已预设为24mA,若自行焊接需注意。

独家技巧:用万用表测LED阴极对地电压,正常应为1.8-2.2V(红光LED)。若电压低于1.5V,说明FPGA驱动不足,需检查.qsf电流设置。

5.4 时序分析报告“Setup Slack is negative”:从关键路径到布局布线的优化实战

负裕量(Negative Slack)意味着电路在目标频率下无法稳定工作。关键路径通常在ALU加法器或标志位生成链。优化策略:

  • 逻辑重构:将ZF <= '1' when result = X"00" else '0';改为ZF <= not (result(7) or result(6) or ... or result(0));,减少组合逻辑级数;
  • 寄存器插入:在长组合路径中插入一级寄存器(Pipeline),如将result_mux输出打一拍再送LED,牺牲一拍延迟换取频率提升;
  • 布局约束:在.sdc文件中添加set_max_delay -from [get_ports sw_a] -to [get_pins alu_core/result_reg/D] 10,强制工具优化关键路径。

实测数据:原始设计在50MHz下Setup Slack = -2.3ns;插入一级result_pipe寄存器后,Slack = +1.8ns,成功达标。西电A测要求时序收敛,这是硬性指标。

6. 从实验到课设:运算器模块在“西电计组课设基本模型机”中的复用策略

完成实验二只是起点。西电计组课设要求搭建“基本模型机”,其核心就是将ALU、寄存器堆、PC、IR、CU等模块集成。此时,实验二的ALU模块成为整个系统的“心脏”,其设计质量直接决定模型机稳定性。

6.1 接口升级:从开关输入到总线驱动的无缝迁移

模型机中,ALU输入不再来自开关,而是来自数据总线(Data Bus)。需改造:

  • 输入端口:bus_a_in,bus_b_in替代sw_a,sw_b;
  • 增加总线使能:alu_en信号,高电平时ALU输出驱动总线;
  • 修改控制逻辑:opcode来自指令寄存器IR(5 downto 3),需增加ir_valid信号确保IR稳定后才采样。

关键改动:

-- 模型机中,ALU输入来自总线 signal a_from_bus : std_logic_vector(7 downto 0); signal b_from_bus : std_logic_vector(7 downto 0); begin a_from_bus <= bus_a_in when alu_en = '1' else (others => 'Z'); -- 高阻态 b_from_bus <= bus_b_in when alu_en = '1' else (others => 'Z');

6.2 扩展功能:支持乘除法与多字节运算的渐进式演进

实验二仅要求8位运算,模型机需支持16位乘法(MUL指令)。策略:

  • 复用ALU:用8位ALU迭代实现16位乘法(Booth算法),CU生成多拍控制信号;
  • 标志位增强:增加OF(Overflow Flag)用于有符号溢出检测,公式为`OF = (A(7) xor B(7)) and not

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询