当前位置:首页 > 技术 > 正文内容

16位RISC硬布线模型机设计与实现

访客 技术 2026年6月5日 1

指令集设计

指令格式采用12位操作码、2位目的寄存器(RD)和2位源寄存器(RS)的固定编码方案,共计8条指令:

助记符OP码(12位)RDRS功能描述
IN001HRDXX从键盘读取数据存入RD
SUB002HRDRSRD - RS → RD
STA003HRDRSRS → [RD]
LD004HRDRS[RS] → RD
MOV005HRDRSRS → RD
ADD006HRDRSRS + RD → RD
OUT007HXXRSRS → 总线输出
JMP008HXXRSRS → PC

测试程序示例

地址(Hex)机器码(Hex)汇编指令执行说明
000013IN R0R0 = 0x04
010017IN R1R1 = 0x01
020021SUB R0, R1R0 = 0x04 - 0x01 = 0x03
03007COUT R0总线输出R0
04001BIN R2R2 = 0xFF
050038STA R2, R0R0 → [R2]
060046LD R1, R2[R2] → R1, R1 = 0x03
07007DOUT R1总线输出R1
080051MOV R0, R1R0 = R1 = 0x03
090061ADD R0, R1R0 = 0x03 + 0x03 = 0x06
0A007COUT R0总线输出R0
0B0013IN R0R0 = 0
0C008CJMP R0跳转到地址00

硬布线控制器设计

指令执行流程图

每条指令的执行划分为两个机器周期M1和M2,每个周期内包含4个时序节拍T1-T4。M1周期负责取指令操作,M2周期执行具体指令操作。

(流程图图示需保留)

控制信号真值表

控制信号逻辑基于指令类型和当前时序状态确定,其中每格内容表示该控制信号在该指令下有效的时序条件。以IN指令为例,SW_B信号在M2&T1条件下激活,对应逻辑表达式为 (IN & M2 & T1)。

控制信号IN(0001)ADD(0010)STA(0011)OUT(0100)JMP(0101)SUB(0110)MOV(0111)LD(1000)
SW_BM2&T1
LD_REG1!(M2&T1)|(M2&T1&IR3)!(M2&T3)|(M2&T3&IR3)!(M2&T3)|(M2&T3&IR3)!(M2&T1)|(M2&T1&IR3)!(M2&T2)|(M2&T2&IR3)
LD_REG0!(M2&T1)|(M2&T1&IR2)!(M2&T3)|(M2&T3&IR2)!(M2&T3)|(M2&T3&IR2)!(M2&T1)|(M2&T1&IR2)!(M2&T2)|(M2&T2&IR2)
SEL1!(M2&T1)|(M2&T1&IR3)|!(M2&T2)|(M2&T2&IR1)!(M2&T1)|(M2&T1&IR3)|!(M2&T2)|(M2&T2&IR1)!(M2&T1)|(M2&T1&IR1)!(M2&T1)|(M2&T1&IR1)!(M2&T1)|(M2&T1&IR3)|!(M2&T2)|(M2&T2&IR1)!(M2&T1)|(M2&T1&IR1)!(M2&T1)|(M2&T1&IR1)
SEL0!(M2&T1)|(M2&T1&IR2)|!(M2&T2)|(M2&T2&IR0)!(M2&T1)|(M2&T1&IR2)|!(M2&T2)|(M2&T2&IR0)!(M2&T1)|(M2&T1&IR0)!(M2&T1)|(M2&T1&IR0)!(M2&T1)|(M2&T1&IR2)|!(M2&T2)|(M2&T2&IR0)!(M2&T1)|(M2&T1&IR0)!(M2&T1)|(M2&T1&IR0)
REG_B(M2&T1)|(M2&T2)(M2&T1)|(M2&T2)M2&T1M2&T1(M2&T1)|(M2&T2)M2&T1M2&T1
LD_DR1M2&T2M2&T2
LD_DR0M2&T1M2&T1
S30&M2&T30&M2&T3
S20&M2&T30&M2&T3
S11&M2&T30&M2&T3
S00&M2&T31&M2&T3
ALU_BM2&T3M2&T3
LD_ARM1&T1M1&T1(M1&T1)|(M2&T1)M1&T1M1&T1M1&T1M1&T1(M1&T1)|(M2&T1)
W/RM2&T2
RAM_BM1&T3M1&T3M1&T3M1&T3M1&T3M1&T3M1&T3(M1&T3)|(M2&T2)
LD_PCM2&T1
INC_PCM1&T2M1&T2M1&T2M1&T2(M1&T2)|(M2&T1)M1&T2M1&T2M1&T2
PC_BM1&T1M1&T1M1&T1M1&T1M1&T1M1&T1M1&T1M1&T1
LD_IRM1&T3M1&T3M1&T3M1&T3M1&T3M1&T3M1&T3M1&T3

硬布线控制器实现(VHDL)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CONTROL_UNIT IS
PORT(
    CLR    : IN STD_LOGIC;
    IR     : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
    TICK1  : IN STD_LOGIC;
    TICK2  : IN STD_LOGIC;
    TICK3  : IN STD_LOGIC;
    TICK4  : IN STD_LOGIC;
    ALU_CTL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
    REG_EN : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
    SEL    : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
    REG_BUS, DR1_LD, DR0_LD, CARRY_IN, ALU_M, ALU_OE,
    AR_LD, MEM_WR, MEM_OE, PC_LD, PC_INC, PC_OE, IR_LD : OUT STD_LOGIC;
    M_STATE: OUT STD_LOGIC_VECTOR(1 DOWNTO 0) := "01";
    SW_IN  : OUT STD_LOGIC
);
END CONTROL_UNIT;

ARCHITECTURE RTL OF CONTROL_UNIT IS
    SIGNAL M1, M2 : STD_LOGIC := '0';
    SIGNAL IN_CMD, ADD_CMD, STA_CMD, OUT_CMD, JMP_CMD, SUB_CMD, MOV_CMD, LD_CMD : STD_LOGIC := '0';
BEGIN
    -- 机器周期切换(T4下降沿触发)
    PRocESS(TICK4)
    BEGIN
        IF FALLING_EDGE(TICK4) THEN
            IF M1 = '1' THEN
                M1 <= '0';
                M2 <= '1';
            ELSE
                M1 <= '1';
                M2 <= '0';
            END IF;
        END IF;
    END PROCESS;

    -- 组合逻辑:控制信号生成
    PROCESS(TICK1, TICK2, TICK3, TICK4, M1, M2, CLR, IR)
    VARIABLE tmp : STD_LOGIC_VECTOR(3 DOWNTO 0);
    BEGIN
        -- 默认值
        ALU_CTL <= "0000";
        REG_EN  <= "11";
        SEL     <= "11";
        REG_BUS <= '0'; DR1_LD <= '0'; DR0_LD <= '0';
        CARRY_IN <= '0'; ALU_M <= '0'; ALU_OE <= '0';
        AR_LD <= '0'; MEM_WR <= '0'; MEM_OE <= '0';
        PC_LD <= '0'; PC_INC <= '0'; PC_OE <= '0';
        IR_LD <= '0'; SW_IN <= '0';

        -- 复位处理
        IF CLR = '1' THEN
            -- 所有信号置零
            NULL;
        END IF;

        -- 指令译码
        IN_CMD  <= '0'; ADD_CMD <= '0'; STA_CMD <= '0';
        OUT_CMD <= '0'; JMP_CMD <= '0'; SUB_CMD <= '0';
        MOV_CMD <= '0'; LD_CMD  <= '0';
        CASE IR(7 DOWNTO 4) IS
            WHEN "0001" => IN_CMD  <= '1';
            WHEN "0010" => ADD_CMD <= '1';
            WHEN "0011" => STA_CMD <= '1';
            WHEN "0100" => OUT_CMD <= '1';
            WHEN "0101" => JMP_CMD <= '1';
            WHEN "0110" => SUB_CMD <= '1';
            WHEN "0111" => MOV_CMD <= '1';
            WHEN "1000" => LD_CMD  <= '1';
            WHEN OTHERS => NULL;
        END CASE;

        -- 控制信号赋值(基于真值表的逻辑简化)
        SW_IN <= IN_CMD AND M2 AND TICK1;
        REG_EN(1) <= (IN_CMD AND (NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(3)))) OR
                     (ADD_CMD AND (NOT (M2 AND TICK3) OR (M2 AND TICK3 AND IR(3)))) OR
                     (SUB_CMD AND (NOT (M2 AND TICK3) OR (M2 AND TICK3 AND IR(3)))) OR
                     (MOV_CMD AND (NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(3)))) OR
                     (LD_CMD AND (NOT (M2 AND TICK2) OR (M2 AND TICK2 AND IR(3))));
        REG_EN(0) <= (IN_CMD AND (NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(2)))) OR
                     (ADD_CMD AND (NOT (M2 AND TICK3) OR (M2 AND TICK3 AND IR(2)))) OR
                     (SUB_CMD AND (NOT (M2 AND TICK3) OR (M2 AND TICK3 AND IR(2)))) OR
                     (MOV_CMD AND (NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(2)))) OR
                     (LD_CMD AND (NOT (M2 AND TICK2) OR (M2 AND TICK2 AND IR(2))));
        SEL(1) <= (ADD_CMD OR STA_CMD OR SUB_CMD) AND
                  ((NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(3)) OR
                    NOT (M2 AND TICK2) OR (M2 AND TICK2 AND IR(1)))) OR
                  (OUT_CMD OR JMP_CMD OR MOV_CMD OR LD_CMD) AND
                  ((NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(1))));
        SEL(0) <= (ADD_CMD OR STA_CMD OR SUB_CMD) AND
                  ((NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(2)) OR
                    NOT (M2 AND TICK2) OR (M2 AND TICK2 AND IR(0)))) OR
                  (OUT_CMD OR JMP_CMD OR MOV_CMD OR LD_CMD) AND
                  ((NOT (M2 AND TICK1) OR (M2 AND TICK1 AND IR(0))));
        REG_BUS <= ((ADD_CMD OR STA_CMD OR SUB_CMD) AND ((M2 AND TICK1) OR (M2 AND TICK2))) OR
                    ((OUT_CMD OR JMP_CMD OR MOV_CMD OR LD_CMD) AND (M2 AND TICK1));
        DR1_LD <= (ADD_CMD OR SUB_CMD) AND (M2 AND TICK2);
        DR0_LD <= (ADD_CMD OR SUB_CMD) AND (M2 AND TICK1);
        ALU_CTL(1) <= ADD_CMD AND (M2 AND TICK3);  -- S1
        ALU_CTL(0) <= SUB_CMD AND (M2 AND TICK3);  -- S0
        ALU_OE <= (ADD_CMD OR SUB_CMD) AND (M2 AND TICK3);
        AR_LD <= (M1 AND TICK1) OR ((STA_CMD OR LD_CMD) AND (M2 AND TICK1));
        MEM_WR <= STA_CMD AND (M2 AND TICK2);
        MEM_OE <= (M1 AND TICK3) OR (LD_CMD AND (M2 AND TICK2));
        PC_LD <= JMP_CMD AND M2 AND TICK1;
        PC_INC <= (M1 AND TICK2) OR (JMP_CMD AND (M2 AND TICK1));
        PC_OE <= M1 AND TICK1;
        IR_LD <= M1 AND TICK3;
        M_STATE <= M2 & M1;
    END PROCESS;
END RTL;

优化方向

可将现有两周期方案压缩为单周期执行模式,即一个机器周期完成一条指令。以ADD R0, R1为例:

T1: PC → AR
T2: RAM → IR  (取指)
T3: R0 → DR0, R1 → DR1  (双端口寄存器组并行传输)
T4: DR0 + DR1 → R0, PC+1  (执行与PC更新并行)

通过流水线技术和双端口寄存器堆,可显著提升吞吐率。

系统架构

(整机结构图需保留并标注关键数据通路)

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。