大家好我有以下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是一个免费的runnig计数器,一切都是std_logic_vector或std_logic
signal data_cnt_r : std_logic_vector(11 downto 0); -- 12 bit counter
write_data转到BUFIO,它也是标准逻辑向量
答案 0 :(得分:1)
您的其他转场附近发生了什么? (1027,3,2,1) 这是一个过程块还是异步? data_cnt_r是无符号的吗? data_reg和CRC值怎么样?我假设两个std_logic_vectors?
我们需要更多的背景
您可以尝试明确添加转换以查看它是否有助于ala:
('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" );