2

您如何最聪明地设计用于初始化芯片的 VHDL 状态机。

我目前的设计是(在伪代码中):

....
....
案例状态:
当 s0 =>
VHDL_CODE_FOR_WRITING_VALUE_TO_REGISTER
状态:= s1;
当 s1 =>
VHDL_CODE_FOR_WRITING_ANOTHER_VALUE_TO_REGISTER
状态:= s1;
当 s2 =>
DO_SOMETHING_ELSE_TO_FINISH_INIT
....
....
结束时;

s0 和 s1 中的代码仅因写入寄存器的值不同。

这让我觉得一定有更聪明的方法(仍然可以合成)?

让我觉得可以做得更聪明的是“不要重复自己”这句话,但我不确定这是否适用于 VHDL。

4

2 回答 2

3

如果你在状态 s0 和 s1 有共同的赋值,把它从 case 语句中拉出来。

case state:
when s0 =>    
    a <= '0';
    b <= '1';
    c <= '0';
    nextState <= s1;
when s1 =>    
    a <= '0';
    b <= '1';
    c <= '1';
    nextState <= s2;
when s2 =>    
    a <= '1';
    b <= '0';
    c <= '1';
endcase;

...会成为...

a <= '0';
b <= '1';
c <= '1';

case state:
when s0 =>    
    c <= '0';
    nextState <= s1;
when s1 =>    
    nextState <= s2;
when s2 =>    
    a <= '1';
    b <= '0';
endcase;

...或者如果这不合适,请将代码拉入一个函数并在每种情况下调用它。

不过,VHDL 并没有什么具体的内容。

于 2012-08-13T16:57:11.410 回答
2

尽管 VHDL 回答者(包括我)的不断重复是“思考硬件,而不是软件”,但这一次软件思考过程是为您服务的一个很好的过程 :)

通常的不重复自己(DRY)解决方案是将您想要的行为封装在函数或过程中。您可以在 VHDL 中做到这一点,任何有能力的工具都可以使用它。

于 2012-08-14T08:44:44.230 回答