自己一直使用verilog,对VHDL语法不熟,先请教各位大侠如下语句
process(reset, clk)
if reset='1' then
a<='0';
elsif clk'event and clk='1' then
if flag='1' then
case count(7 downto 0) is
when X"00"=>
a<='100';
.......
.......
end case
b<='1';------------------------------------这里有疑问
case count(7 downto 0) is
........
.........
end case
else
.......
endif
endif
endprocess
请问这个b<='1';以及其后的case语句与上面的那个case语句是并行执行的吗? 进程内部职能书写顺序语句。
b<='1';以及其后的case语句也是在flag=1条件下才执行的吗? 是的。
always@(posedge clk or posedge reset)
if (reset)
a <= '0';
else
begin
if(flag)
begin
case count(7:0)
8'h00 : a <= 3'b100;
...
...
endcase;
b <= 1'b1;
case count(7:0)
...
...
endcase;
你查看下作用范围,if/end if之间的语句都算if的作用范围,所以b是受if=1这条件影响的。这块和verilog里begin/end也是顺序执行语句,但是因为是时序电路,里面的语句都是同一时刻被执行的。
这话不太好说,我举两例子。
一,最简单的,
process(reset, clk)
if reset='1' then
a<='0';
elsif clk'event and clk='1' then
b <=a;
c <= b;
end if;
这个都明白,b的值落后a一个时钟周期后,c的值落后b一个时钟周期后。
二,如果是同一个信号呢?
process(reset, clk)
if reset='1' then
a<='0';
elsif clk'event and clk='1' then
a <= b;
if (flag == 1) then
a <= 0;
end if;
end if;
在这情况下,如果flag不为1,那只执行a<=b这操作了, 如果flag为1,那相当于先执行a<=b,然后又被赋值a<=0一遍,最后a的值得仍为0, 相当于仍为顺序操作。