VHDL比较不在硬件中工作,但在仿真中工作

时间:2011-11-03 17:48:19

标签: vhdl fpga xilinx

大家好我有以下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,它也是标准逻辑向量

1 个答案:

答案 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"  );