如何设计支持任意起始位连续4位访问的可位寻址内存(RISC架构)
RISC单周期电路:跨4位存储块的连续bit寻址取数设计
需求明确
现有16位数据:1101101001100010
- 索引0:取前4位 →
1101 - 索引3:跳过前3个bit,取连续4位(对应数据段为跨块的连续4位)
当前指令内存以4位为单个存储块,需实现从任意bit索引开始,连续取4位的功能。
核心设计方案
1. 存储块映射
将16位数据按高位到低位拆分为4个独立的4位存储单元,记为:
Mem[0]:最高4位 →1101Mem[1]:次高4位 →1010Mem[2]:次低4位 →0110Mem[3]:最低4位 →0010
2. 地址解码与块选择
对输入的bit索引idx(合法范围0~12,因需取4位,最大索引为16-4=12),计算两个关键参数:
- 起始块地址:
blk_addr = idx // 4(整数除法,如idx=3时blk_addr=0,idx=4时blk_addr=1) - 块内偏移:
offset = idx % 4(如idx=3时offset=3,idx=5时offset=1)
根据offset判断取数逻辑:
- 若
offset = 0:仅读取Mem[blk_addr],直接输出该块的4位数据。 - 若
offset ≠ 0:需同时读取Mem[blk_addr]和Mem[blk_addr+1](因4位数据会跨两个存储块)。
3. 跨块数据拼接(移位+或运算)
当需要跨块取数时,通过以下步骤拼接数据:
- 将
Mem[blk_addr]执行逻辑右移,移位位数为4 - offset,保留低offset位有效数据(高位补0)。 - 将
Mem[blk_addr+1]执行逻辑左移,移位位数为offset,保留高4 - offset位有效数据(低位补0)。 - 将两个移位结果做按位或运算,得到最终的4位连续数据。
验证示例(以idx=3为例)
blk_addr=0,offset=3Mem[0] = 1101→ 右移1位 →0110Mem[1] = 1010→ 左移3位 →1000- 按位或运算:
0110 | 1000 = 1110(对应原始数据中跳过前3位后的连续4位)
4. 电路硬件实现
通过以下模块组合完成功能:
- 地址解码器:根据
idx生成对应存储块的读取使能信号,控制是否读取单个块或两个块。 - 移位器:两个4位可控移位器,分别处理两个存储块的移位操作。
- 多路选择器:根据
offset是否为0,选择输出单个块数据或移位拼接后的结果。 - 逻辑运算单元:实现跨块时的按位或拼接。
内容的提问来源于stack exchange,提问作者Nishant Jalan
相关产品推荐
相关产品推荐

