0

大家好,我有以下 VHDL,它在硬件中没有做它应该做的事情,但它确实在模拟中工作。基本上我有一个计数器,根据我想要输出某些数据的计数,我实现了多路复用器,如下所示:

write_data  <=  
('1' & '0' & "1111"                                                              )  when (data_cnt_r < 1)  else             
('0' & '0' & "1111"                                                              ) when (data_cnt_r >= 1 and data_cnt_r < 2 ) else
('0' & '0' & "0000"                                                              ) when (data_cnt_r >= 2 and data_cnt_r < 3 ) else  
('0' & '0' & data_reg                                                        ) when (data_cnt_r >= 3  and data_cnt_r < 1027 ) else
('0' & '1' & CRC16_o(63) & CRC16_o(47) & CRC16_o(31) & CRC16_o(15) ) when (data_cnt_r >= 1027  and data_cnt_r < 1043 ) else 
('0' & '0' & "1111");   

我遇到的问题是,当计数为 1043 时,我看到的是 CRC 输出,而不是在代码的最后一行看到“1111”。在模拟中,它的工作方式与我预期的一样。有没有更好的方法来写这个?任何想法为什么会出现差异?

*根据要求编辑更多详细信息:

我正在使用

   use IEEE.STD_LOGIC_UNSIGNED.ALL; 

data_cnt 是一个免费的运行计数器,一切都是 std_logic_vector 或 std_logic

    signal data_cnt_r       : std_logic_vector(11 downto 0); -- 12 bit counter

write_data 去一个BUFIO,它也是一个标准的逻辑向量

4

1 回答 1

1

你的其他过渡附近发生了什么?(1027, 3, 2, 1) 这是在进程块中还是异步的?data_cnt_r 是无符号的吗?data_reg 和 CRC 值呢?我假设两个 std_logic_vectors?

我们需要更多的上下文

您可以尝试显式添加过渡以查看它是否有帮助:

('0' & '1' & CRC_stor)  when (data_cnt_r >= 1027 and data_cnt_r < 1043 ) else 
('0' & '0' & "1111"  )  when (data_cnt_r = 1043) else
('0' & '0' & "1111"  );

如果这实际上是在一个时钟处理块中,您可能会在一个时钟周期后看到 write_data 中的 CRC 值,但是您也会在其他转换周围看到这个问题(它们都会在 data_cnt_r 后面更新一个周期)

如果它位于非时钟进程块中,您可能会遇到意外的逻辑错误

这也更容易阅读。

CRC_stor <= CRC16_o(63) & CRC16_o(47) & CRC16_o(31) & CRC16_o(15)

write_data  <=  
   ('1' & '0' & "1111"  )  when (data_cnt_r = 0) else             
   ('0' & '0' & "1111"  )  when (data_cnt_r = 1) else
   ('0' & '0' & "0000"  )  when (data_cnt_r = 2) else  
   ('0' & '0' & data_reg)  when (data_cnt_r >= 3    and data_cnt_r < 1027 ) else
   ('0' & '1' & CRC_stor)  when (data_cnt_r >= 1027 and data_cnt_r < 1043 ) else 
   ('0' & '0' & "1111"  );
于 2011-11-04T18:30:00.877 回答