1 Quartus波形仿真的仿真工具Simulation Tool里面,有一个选项是Overwrite simulation input file with simulation result,这一项前面的很容易被误操作勾掉,结果观察不到仿真输出的波形。
2 使用VHDL时,两个process里面不能改变相同的信号,这样的信号不能别确定。
3 一个process里面只能出现一个时钟,不能引入多余的时钟。
4 对于process,还有一个很疑惑的地方。
书上说,仿真器对进程中的各语句自上至下地进行处理。当进程所有语句执行完毕,或者中途碰到WAIT语句时,该进程执行结束,信号代入过程最后被执行。代入同样应该按顺序自上至下地执行。
接着给出来一个这样的例子。
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
process (A, B, C, D) is
begin
D <= A;
X <= B + D;
D <= C;
Y <= B + D;
end process;
在这个进程中,X和Y的最后代入值都是B + C,因为像这种在一个进程中对对某信号有两次代入要取最后一个。
然后在一些网页上面看到。这么一个例子(同步整形电路)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
process(clk)
begin
if clk'event and clk='1' then
x<=din;
y<=x;
end if;
dout<=x and (not y);
end process;
说在进程中,信号不是在改变值之后立即变化的,其他语句使用的还是该信号的旧值(未执行进程时的值),所以假设y=0,那么在时钟的上升沿:
如果din="1"小于一个时钟宽:则有x=1,y=0(虽然进程中改变了值,但不会立即被使用),则有dout=x and (not y)=1 and (not 0)=1;
我不明白后面一种说“信号不是在改变值之后立即变化的,其他语句使用的还是该信号的旧值”这句话是什么意思,如果按着这种说法,那么上面的例子中X,Y为何代入的是改变之后的值?
另外,对于第二个例子,为什么y使用的是旧值,而x不是呢?
5 在设计程序的时候,用软件结合硬件的方法,会给整体带来很好的可调性,可以很方便的对每个模块进行验证和仿真,不过这时候问题往往会出现在两个模块连接的地方。
6 在数码管动态扫描中,扫描频率如果过小的话没有到视觉暂留将不能看正常显示(-_-!地球人都知道),可是如果扫描频率过大的话可能会导致每段点亮不充分而也不能正常显示。所以要选择一个始终的频率。
7 在考虑按键防抖的时候,认为机械按键的抖动在10ms之内,所以用100Hz的采样频率就可以防抖。
8 在architecture中的signal是可以赋初值的,往往这个初值会对结果产生影响。
9 用Quartus里面的RTL Viewer,查看寄存器级别的电路,对于分析VHDL语法等很有帮助。(多亏了好歹学了Patterson那本计算机组成与设计啊!)