在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3396|回复: 9

[求助] 询问VHDL语法问题

[复制链接]
发表于 2012-5-15 23:22:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 huizi0711 于 2012-5-15 23:25 编辑

自己一直使用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写,如何写,哪位大侠给写个框架吧
发表于 2012-5-16 09:22:34 | 显示全部楼层
进程语句是顺序语句,不是并行语句;

同样关注
发表于 2012-5-16 09:26:32 | 显示全部楼层
可否把你的整个代码给贴出来我看看,这样我看的有点摸不着头脑
发表于 2012-5-16 10:13:15 | 显示全部楼层
本帖最后由 gmm.dl.cn 于 2012-5-16 10:18 编辑

请问这个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
有不对的地方请指正批评,同学习。
 楼主| 发表于 2012-5-16 11:33:07 | 显示全部楼层
回复 4# gmm.dl.cn


    多谢了,不过你的这个Verilog写的是不对的吧
发表于 2012-5-16 15:28:30 | 显示全部楼层
你查看下作用范围,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语法时,看到如上的写法,觉得这样很有问题,但真有很多代码这么写,并且工作还正常。
 楼主| 发表于 2012-5-17 09:36:08 | 显示全部楼层
多谢楼上
发表于 2012-5-17 10:56:59 | 显示全部楼层
回复 5# huizi0711


    请教,哪里错了?我verilog不是很熟。但是我感觉对应vhdl的异步复位应该是两个触发信号的。
发表于 2012-5-17 11:17:06 | 显示全部楼层
参考一下。嘿嘿
发表于 2012-5-18 09:58:23 | 显示全部楼层
语法上不标准的地方:process(reset,clk)的下一句应该有begin;case count(7 downtown 0) is
改成case count is
别纠结于语句的执行情况,看vhdl与原先的verilog综合出来的电路是否一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 23:41 , Processed in 0.026702 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表