VHDL移位寄存器程序在使用信号和变量时会产生不同的结果
所以我一直在用VHDL做一个寄存器,如果加载为“1”,它将加载到输入X中,并以串行方式输出数据,基本上是一个并行输入串行输出寄存器。输入X是一个4位(3到0)输入,我想让程序在寄存器成功输出输入中的所有BTI时持续输出0 当“count”被定义为信号时,它工作。然而,当count被定义为变量时,输出为常量0,无论负载是否为“1”。我的代码如下所示:VHDL移位寄存器程序在使用信号和变量时会产生不同的结果,vhdl,Vhdl,所以我一直在用VHDL做一个寄存器,如果加载为“1”,它将加载到输入X中,并以串行方式输出数据,基本上是一个并行输入串行输出寄存器。输入X是一个4位(3到0)输入,我想让程序在寄存器成功输出输入中的所有BTI时持续输出0 当“count”被定义为信号时,它工作。然而,当count被定义为变量时,输出为常量0,无论负载是否为“1”。我的代码如下所示: entity qn14 is Port ( clk : in STD_LOGIC; reset : in STD_LOGI
entity qn14 is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
LOAD : in STD_LOGIC;
X : in STD_LOGIC_VECTOR (3 downto 0);
output : out STD_LOGIC);
end qn14;
architecture qn14_beh of qn14 is
type states is ( IDLE , SHIFT );
signal state : states;
signal count: STD_LOGIC_VECTOR(1 downto 0);
begin
process(clk , reset)
variable temp: STD_LOGIC;
variable data: STD_LOGIC_VECTOR(3 downto 0);
begin
if reset = '1' then
state <= IDLE;
count <= "00";
output <= '0';
elsif clk'event and clk = '1' then
case state is
when IDLE =>
if LOAD = '1' then
data := X;
output <= '0';
state <= SHIFT;
elsif LOAD = '0' then
output <= '0';
end if;
when SHIFT =>
if LOAD ='1' then
output <= '0';
elsif LOAD = '0' then
output <= data( conv_integer(count) );
count <= count + 1;
if (count >= 3) then
state <= IDLE ;
end if;
end if;
end case;
end if;
end process;
end qn14_beh;
实体qn14是
端口(时钟:在标准逻辑中;
复位:在标准逻辑中;
负载:在标准逻辑中;
X:标准逻辑向量(3到0);
输出:输出标准(U逻辑);
结束qn14;
qn14的架构qn14_beh是
类型状态为(怠速、换档);
信号状态:状态;
信号计数:标准逻辑向量(1到0);
开始
过程(时钟、复位)
可变温度:标准逻辑;
变量数据:标准逻辑向量(3到0);
开始
如果重置='1',则
声明这可能无法完全回答您的问题,但我将介绍我看到的几个问题
elsif LOAD='0',则
可以是else
,除非您试图覆盖其他状态(X,U…),但您仍然希望else
覆盖这些状态
count=3
比count>=3
更清晰count
是一个2位向量,因此它不能大于3
虽然在SHIFT
状态下断言LOAD
时输出0
,但实际上并没有加载新值。你打算这么做吗
将计数更改为变量而不更改分配的位置将导致第一个X
->输出序列提前中止一个周期(在对3进行测试之前增加count
)。它将导致后续的X
->输出序列“X(3)
,X(0)
,X(1)
,X(2)
”
从不使用变量temp
。变量data
的工作原理与信号一样。此用途不需要变量的属性。这也提出了一个问题,为什么您尝试将count
作为变量;除非您需要即时分配变量,否则通常最好使用信号,因为信号更容易在(大多数)模拟器中查看,也更难出错。我希望您不要试图以count
作为变量结束,而只是出于学术上的好奇,为什么它不起作用
你在模拟器里看过这个吗?你正确地改变状态了吗?所有输入的所有位是否都被强驱动到定义的值('1'
或'0'
)
我看不到任何东西会导致您描述的故障,仅仅是将count
更改为来自信号的变量,但是更改会导致上述不期望的行为。我的最佳猜测是,您的症状源于您如何驱动输入的问题。当“计数”被定义为信号时,它起作用;然而,当计数被定义为变量时,无论负载是否为“1”,输出都是常量0。是的,但是你的问题是什么?您不会将count
作为变量显示版本,并且您的代码不是变量。如果对变量赋值是立即的,则可以立即在表达式中计算新值。计划分配的信号值、预计输出波形和未来模拟周期中可用的值。