微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 询问VHDL语法问题

询问VHDL语法问题

时间:10-02 整理:3721RD 点击:

自己一直使用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综合出来的电路是否一样

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top