VHDL比较不适用于硬件,但适用于模拟
嗨,伙计们,我有下面的VHDL,它在硬件上不做它认为应该做的,但它在模拟中工作。基本上,我有一个计数器,根据计数,我希望输出某些数据,我实现了mux,如下所示:VHDL比较不适用于硬件,但适用于模拟,vhdl,fpga,xilinx,Vhdl,Fpga,Xilinx,嗨,伙计们,我有下面的VHDL,它在硬件上不做它认为应该做的,但它在模拟中工作。基本上,我有一个计数器,根据计数,我希望输出某些数据,我实现了mux,如下所示: write_data <= ('1' & '0' & "1111" ) when (data_cnt_r < 1) else ('0' & '0
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");
数据是一个自由运行的计数器,一切都是标准逻辑向量或标准逻辑
signal data_cnt_r : std_logic_vector(11 downto 0); -- 12 bit counter
写入数据进入BUFIO,它也是一个标准逻辑向量在其他转换附近发生了什么?(1027, 3, 2, 1) 这是在进程块中还是异步的? 数据是未签名的吗?数据_reg和CRC值如何?我假设两个标准逻辑向量 我们需要更多的背景 您可以尝试显式添加转换,以查看它是否有助于:
('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" );
('0'和'1'和CRC存储)当(数据量>=1027和数据量<1043)其他
('0'和'0'和'1111')当(数据=1043)其他
('0' & '0' & "1111" );
如果这实际上是在一个时钟进程块中,您可能会在一个时钟周期后在写入数据中看到CRC值,但在其他转换中也会看到这个问题(它们都会更新数据后面的一个周期)
如果其位于未锁定的进程块中,则可能会出现意外的逻辑错误
这也更容易阅读
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" );
CRC存储=1027,数据存储<1043)其他
('0' & '0' & "1111" );
< /代码>您可能想考虑使用(n=0)而不是(n<1)。另外,假设数据的两状态逻辑,所有情况下的第一个条件都是冗余的。数据的数据类型是什么?我不认为问题就在这一行。我可能需要看更多的代码。通常情况下,模拟和硬件之间的差异是由诸如不正确的灵敏度列表之类的事情造成的,但这并不是一个过程。他们也应该在sim/syn期间作为警告出现。好的观点,谢谢大家,我感谢大家的反馈和帮助,我解决了这个问题。我有两个问题。1) 我没有记录输出,2)输出时钟应该与FPGA输出的数据的相位相差90,以便设备正确时钟。
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" );