按顺序执行两个代码块,但代码本身并行

时间:2016-10-24 06:04:44

标签: vhdl fpga

我有一段代码需要一个接一个地执行。例如,我有一个加法slv_reg2 <= slv_reg0 + slv_reg1;,然后我需要从数字中减去结果。

architecture IMP of user_logic is

signal slv_reg0                       : std_logic_vector(0 to C_SLV_DWIDTH-1); --32 bits wide
signal slv_reg1                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal slv_reg2                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal slv_reg3                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal flag                           : bit := '0';

begin

  slv_reg2 <= slv_reg0 + slv_reg1;
  flag <= '1'; 

process (flag)
begin
  IF (flag = '1') THEN
    slv_reg3 <= slv_reg0 - slv_reg2;
  END IF;  
end process; 

end IMP;

我还没有测试过上面的代码,但如果我的想法是正确的,我想要一些反馈。 process中包含的内容需要按顺序运行,如何使此部分也并行运行?

总之,我有两个需要按顺序执行的代码块,但代码itselft应该并行运行。

- UPDATE -

begin
slv_regX <= (slv_reg0 - slv_reg1) + (slv_reg2 - slv_reg3) +(slv_reg4 - slv_reg5); --...etc
process(clk) -- Process for horizontal counter
begin
if(rising_edge(clk)) then
  if(flag = 1) then
    flag <= 0;
  end if;
end if;
end process; 

1 个答案:

答案 0 :(得分:2)

它是并发的,而不是并行的。只需使用中间信号

我担心你关于VHDL的思考过程并不完全正确。您承认第一个任务“并行”发生,但您必须意识到该过程也与其余语句同时运行。只有在内部过程中发生的事情才会按顺序进行评估 - 每次灵敏度列表中的任何信号都会发生变化。

我需要对你需要的东西做出很多假设,但也许你只是在这种风格之后:

c <= a + b;
e <= d - c;

信号e始终包含d-(a+b)。如果你不能立即理解为什么 - 这就是并发和并行之间的区别所在。它正在不断评估 - 就像你用铜线连接电路一样。

如果你真正需要的是基于时钟发生的事情 - 你真的还没有你的例子,我建议先查看示例和教程。一旦您提供更完整的VHDL代码,人们将乐意为您提供帮助。

示例中的问题

假设您打算编写可合成的VHDL,您的代码会出现一些问题:

  • 您的过程敏感度列表不正确 - 您要么只对时钟敏感,要么对过程的所有输入信号敏感。
  • 您正在将'flag'初始化为'1'并在并发代码中将其指定为'0',这是没有意义的。
  • 未分配信号..reg0和..reg1。如果它们是输入,请不要将它们声明为信号。
  • 您已将信号命名为匿名编号的“寄存器”,但它们不是寄存器,只是信号:电线! (如果因为你与Verilog比较而结束了这种风格 - 让我争辩说Verilog'reg'通常没有意义,因为它们通常最终不是寄存器。)

试一试

  

我还没有测试过上面的代码,但是

你真的应该。查找代码示例,教程,去玩!