网站重新上线,多谢朋友们的关心
Jan
16
网上看到一篇关于Finite State Machine (FSM) - 有限状态机的文章《有限状态机的VHDL优化设计》,写得挺详细,有些感想和经验记录于此:
1. 关于使用的语言 - VHDL和Verilog大同小异,想法是一样的,万变不离其宗。
2. 模板 - 大家都会讨论是一段两端还是三段。争执在两端和三段的情况时有发生。其实只要综合器能综合出设计者期望的电路,怎么写都无所谓。代码是给人看的,如果能让别人更容易读懂,就是好代码。我偏好两段,因为这样在察看代码时能一眼看出某一个state的跳出条件和输出信号。如果状态机的状态数很多,需要上下翻阅才能分别得知跳出条件和输出信号,真是太麻烦了。
3. 结构 - 当前状态用时钟驱动,next_state由组合逻辑生成,这些都是固定的。唯一可能有争议的是输出信号需不需要加寄存器打一拍?


一般来说,如果是模块的输出,我会用寄存器打一拍,保证模块所有输出都由寄存器驱动(因为无法预测负载要经过多少级LUT才能到达下一级寄存器)。这样一来有个坏处:某个状态的输出信号要到下一个时钟才有效,而不是和state一起变化。在某些设计中这个限制会导致一些问题。因此如果是本模块自己使用的信号,我就不用寄存器打一拍了,只要布局布线后能满足Period约束就可以。
4. 状态转换输出 - 对于输出信号的赋值,通常会有两种状况:某个state时需要保持的输出;状态跳转的时候需要一个脉冲的输出。对于第二种输出要求,可以把输出信号写在状态跳转条件的if语句中。
5. 我的模板
1. 关于使用的语言 - VHDL和Verilog大同小异,想法是一样的,万变不离其宗。
2. 模板 - 大家都会讨论是一段两端还是三段。争执在两端和三段的情况时有发生。其实只要综合器能综合出设计者期望的电路,怎么写都无所谓。代码是给人看的,如果能让别人更容易读懂,就是好代码。我偏好两段,因为这样在察看代码时能一眼看出某一个state的跳出条件和输出信号。如果状态机的状态数很多,需要上下翻阅才能分别得知跳出条件和输出信号,真是太麻烦了。
3. 结构 - 当前状态用时钟驱动,next_state由组合逻辑生成,这些都是固定的。唯一可能有争议的是输出信号需不需要加寄存器打一拍?
不加寄存器的输出
输出由寄存器驱动
一般来说,如果是模块的输出,我会用寄存器打一拍,保证模块所有输出都由寄存器驱动(因为无法预测负载要经过多少级LUT才能到达下一级寄存器)。这样一来有个坏处:某个状态的输出信号要到下一个时钟才有效,而不是和state一起变化。在某些设计中这个限制会导致一些问题。因此如果是本模块自己使用的信号,我就不用寄存器打一拍了,只要布局布线后能满足Period约束就可以。
4. 状态转换输出 - 对于输出信号的赋值,通常会有两种状况:某个state时需要保持的输出;状态跳转的时候需要一个脉冲的输出。对于第二种输出要求,可以把输出信号写在状态跳转条件的if语句中。
5. 我的模板
Oct
20
设计中经常由于大小端问题等等需要把一个Bus里所有比特的位置倒置一下,使原来bit0, bit1...bitN的顺序改为bitN, bitN-1, bit0.
以下是从xps_spi_2.00.b中截取的一段代码,用于解决这个问题。
spi_module.vhd , Line 541
以下是从xps_spi_2.00.b中截取的一段代码,用于解决这个问题。
spi_module.vhd , Line 541
if (LSB_first = '1') then
for i in 0 to C_NUM_TRANSFER_BITS-1 loop
Receive_Data(i) <= Shift_Reg(C_NUM_TRANSFER_BITS-1-i);
end loop;
else
Receive_Data <= Shift_Reg;
end if;
for i in 0 to C_NUM_TRANSFER_BITS-1 loop
Receive_Data(i) <= Shift_Reg(C_NUM_TRANSFER_BITS-1-i);
end loop;
else
Receive_Data <= Shift_Reg;
end if;
May
22
有人问在VHDL下有没有类似#ifdef的语句,可不可以认为configuration和verilog的 #ifdef 类似。
configuration,怎么说,在一定程度上可以,但是由于ISE的支持也不是很全,实际操作中估计比较难应用。
其实VHDL下的更类似 #ifdef 的语句是 generate:
1、定义一个generic,可以从外部传递参数
2、通过if xx = '1' generate xxx 的形式,把 #ifdef 包含的内容写出来
一般在做一个可配置的IP core 的时候比较有用。
EDK里面很多IP都是这样写的。
configuration,怎么说,在一定程度上可以,但是由于ISE的支持也不是很全,实际操作中估计比较难应用。
其实VHDL下的更类似 #ifdef 的语句是 generate:
1、定义一个generic,可以从外部传递参数
2、通过if xx = '1' generate xxx 的形式,把 #ifdef 包含的内容写出来
一般在做一个可配置的IP core 的时候比较有用。
EDK里面很多IP都是这样写的。
Oct
24
Xapp199 - Writing Efficient Testbenches 是一篇挺老的Application Note了,我以前也读过,不过今天再读还是有所收获的。这篇文档还是讲了不少内容的。
Oct
12
如果写了一个component有两个architecture,要选择结构体,那么需要用configuration语句:
在声明好Component后,加一句for语句在所有的声明后面(包括signal的声明),begin的前面(Architecture对应的那个Begin)
For Instance_name : component_name USE Entity WORK.entity_name(architecture_name);
其中entity_name其实就是前面对应的component_name
更详细的,可以参考XST User Guide,在文档中查找"component configuration"
在声明好Component后,加一句for语句在所有的声明后面(包括signal的声明),begin的前面(Architecture对应的那个Begin)
For Instance_name : component_name USE Entity WORK.entity_name(architecture_name);
其中entity_name其实就是前面对应的component_name
更详细的,可以参考XST User Guide,在文档中查找"component configuration"








