询问VHDL语法问题
自己一直使用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条件下才执行的吗?
哪位达人给我说说这个程序段得执行过程,感激不尽!
如果这段程序用verilog写,如何写,哪位大侠给写个框架吧
进程语句是顺序语句,不是并行语句;
同样关注
可否把你的整个代码给贴出来我看看,这样我看的有点摸不着头脑
请问这个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;
end
else
...
end
有不对的地方请指正批评,同学习。
多谢了,不过你的这个Verilog写的是不对的吧
你查看下作用范围,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, 相当于仍为顺序操作。
我开始从verilog转成VHDL语法时,看到如上的写法,觉得这样很有问题,但真有很多代码这么写,并且工作还正常。
多谢楼上
请教,哪里错了?我verilog不是很熟。但是我感觉对应vhdl的异步复位应该是两个触发信号的。
参考一下。嘿嘿
语法上不标准的地方:process(reset,clk)的下一句应该有begin;case count(7 downtown 0) is
改成case count is
别纠结于语句的执行情况,看vhdl与原先的verilog综合出来的电路是否一样
