如何使寄存器的值固定
how to make the value of a register fixed
我正在做一个旨在使用 vhdl 设计 mini-mips32 cpu 的项目,我遇到了一个问题。在我的寄存器文件中,我想让 R0 等于 0X“00000000” 并固定,即永远不会 changed.Here 是我的代码:
type reg_array 是std_logic_vector(31 downto 0)的数组(0 to 15);
-- 信号 reg_file : reg_array;
信号 my_reg : reg_array :=
( 0 => "00000000000000000000000000000000",
1 => "00000000000000000000000000000000",
2 => "00000010000000100000001000000011",
3 => "00000011000000110000001100000011",
4 => "00000100000001000000010000000100",
5 => "11110000111100001111000011110000",
6 => "11110000111100001111000011110000",
7 => "11110000111100001111000011110000",
8 => "11110000111100001111000011110000",
9 => "11110000111100001111000011110000",
10 => "11110000111100001111000011110000",
11 => "11110000111100001111000011110000",
12 => "11110000111100001111000011110000",
13 => "11110000111100001111000011110000",
14 => "11110000111100001111000011110000",
15 => "11110000111100001111000011110000");
所以问题来了,R0 是一个 32 位信号,我不能将它定义为 constant.So 如何固定它?即使 my_reg(0)=0X “00000000”永远?提前致谢!
你可以永远不写入它,或者当读取地址为 0 时有一个 returns 为零的多路复用器。我会去读取,因为它应该让合成器轻松优化寄存器 0 .
RdSrc1 <= (others => '0') when unsigned(rdAddr1) = 0 else
my_reg(to_integer(unsigned(rdAddr1));
RdSrc2 <= (others => '0') when unsigned(rdAddr2) = 0 else
my_reg(to_integer(unsigned(rdAddr2));
附带说明一下,您知道可以为向量输入十六进制值吗? val <= X"DEADBEEF";
。我认为您的寄存器声明可以使用它!
Ryan - 您没有显示用于写入寄存器的逻辑,但通常我会屏蔽对特定索引的写入(如果它是只读位置)。
我通常使用 CSR 中的偏移量 0x0 作为修订寄存器,当我解码地址(如果它与 0x0 匹配并且是写入)时,我完成写入但不更新寄存器。对于读取 return 值。
凯文.
我正在做一个旨在使用 vhdl 设计 mini-mips32 cpu 的项目,我遇到了一个问题。在我的寄存器文件中,我想让 R0 等于 0X“00000000” 并固定,即永远不会 changed.Here 是我的代码:
type reg_array 是std_logic_vector(31 downto 0)的数组(0 to 15);
-- 信号 reg_file : reg_array;
信号 my_reg : reg_array :=
( 0 => "00000000000000000000000000000000",
1 => "00000000000000000000000000000000",
2 => "00000010000000100000001000000011",
3 => "00000011000000110000001100000011",
4 => "00000100000001000000010000000100",
5 => "11110000111100001111000011110000",
6 => "11110000111100001111000011110000",
7 => "11110000111100001111000011110000",
8 => "11110000111100001111000011110000",
9 => "11110000111100001111000011110000",
10 => "11110000111100001111000011110000",
11 => "11110000111100001111000011110000",
12 => "11110000111100001111000011110000",
13 => "11110000111100001111000011110000",
14 => "11110000111100001111000011110000",
15 => "11110000111100001111000011110000");
所以问题来了,R0 是一个 32 位信号,我不能将它定义为 constant.So 如何固定它?即使 my_reg(0)=0X “00000000”永远?提前致谢!
你可以永远不写入它,或者当读取地址为 0 时有一个 returns 为零的多路复用器。我会去读取,因为它应该让合成器轻松优化寄存器 0 .
RdSrc1 <= (others => '0') when unsigned(rdAddr1) = 0 else
my_reg(to_integer(unsigned(rdAddr1));
RdSrc2 <= (others => '0') when unsigned(rdAddr2) = 0 else
my_reg(to_integer(unsigned(rdAddr2));
附带说明一下,您知道可以为向量输入十六进制值吗? val <= X"DEADBEEF";
。我认为您的寄存器声明可以使用它!
Ryan - 您没有显示用于写入寄存器的逻辑,但通常我会屏蔽对特定索引的写入(如果它是只读位置)。
我通常使用 CSR 中的偏移量 0x0 作为修订寄存器,当我解码地址(如果它与 0x0 匹配并且是写入)时,我完成写入但不更新寄存器。对于读取 return 值。
凯文.