我正在做的项目旨在使用vhdl设计一个mini-mips32 cpu,我遇到了一个问题。在我的寄存器文件中,我想让R0等于0X“00000000”并修复,即永远无法更改。这是我的代码:
类型reg_array是std_logic_vector的数组(0到15)(31 downto 0);
- signal 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位信号,我不能把它定义为常量。那么如何使它固定?即,永远使my_reg(0)= 0X“00000000”?提前谢谢!
答案 0 :(得分:1)
你可以永远不写入它,或者当读地址为0时有一个返回零的多路复用器。我会去读取,因为它应该让合成器容易地优化寄存器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";
。我认为您的注册声明可以使用它!
答案 1 :(得分:0)
Ryan - 您没有显示用于编写寄存器的逻辑,但如果它是一个只读位置,我通常会将写入屏蔽到特定索引。
我通常在CSR中使用偏移量0x0作为修订寄存器,当我解码地址时,如果它匹配0x0并且是写入,我完成写入但不更新寄存器。对于读取返回值。
凯文。