登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

Vhdl跟C的主要区别是并行,请求高手讲解

作者:籁儿 栏目:EDA技术
Vhdl跟C的主要区别是并行,请求高手讲解
说来惭愧,之前看了一个帖子:
发现vhdl真不好理解

原来用c, 一切逻辑都是那么清楚, 现在用vhdl本来看着很正确的逻辑, 却不行。
也没有书讲为什么, 怎么办呀?

我竟幼稚的回答:
在我看来,C跟vhdl事实上是一样的
只是vhdl中用 end 代替了C 中的 {}
不知道这种说法是不是很肤浅

然后还有一点就是
vhdl里的PROCESS
对于敏感量的问题,我始终有点不理解
曾经有一次,提示PROCESS太复杂而报错
好像是敏感量不能嵌套
不知道是为什么

后来看到好多网友的说法,才知道主要区别在于 并行
但说实话,我真的不是很明白,希望有高人指点

2楼: >>参与讨论
籁儿
没有?
 
3楼: >>参与讨论
籁儿
请求高手解答
 
4楼: >>参与讨论
ziye123456
希望会满意!
我自己编的六十进制简单的程序.architecture中两个主要的1,2if语句是可以颠倒的.1和2 if语句并行执行,不然的话在对al 的判断上这个程序回出问题,那程序就回出错.
library ieee;
use ieee.std_logic_1164.all;
use  ieee.std_logic_unsigned.all;
entity sixty is
PORT( clk:in std_logic;
     ql:out std_logic_vector(3 downto 0);
      qh:out std_logic_vector(3 downto 0));
end;
architecture six of sixty is
signal al:std_logic_vector(3 downto 0);
signal ah:std_logic_vector(3 downto 0);
begin
PROCESS(clk)
begin
if rising_edge(clk) then
        1  if al="1001" then
                  if  ah="0101" then ah<="0000";
                       else ah<=ah+1;
                  end if;
            end if ;
                qh<=ah;
          2 if al="1001" then al<="0000";
                    else al<=al+1;
               end if;
               ql<=al;
          end if;
end PROCESS;
end;

                  
                
                   
                 


5楼: >>参与讨论
籁儿
不好意思
可能是咱俩用的软件不一样
我从来没见过rising_edge 和 分开的1,2if
或者我才只是新手,根本没学到那么深的东西
怎么办

6楼: >>参与讨论
buqibushe
!!!
rising_edge()是ieee.std_logic_1164中定义的,只适合于std_logic/vector,不适于bit/vector


7楼: >>参与讨论
fineamy
为什么老是要和C扯到一块?
我是新手,谈谈我的理解.
两个风马牛不相关的东西为什么老是往一块扯.VHDL或VERILOG HDL属于硬件行为描述语言,顾名思义,就是对硬件如何动作,如何响应等各种信号的描述,实际上,对所要实现硬件功能本身(包括时序,响应顺序,电平高低,状态序列)的通彻理解,那么依据这些行为使用描述语言进行描述就是非常自然的事情,并不需要刻意的去考虑如何"并行",而所谓的与C区别的"并行性",那也是硬件特性决定的.
如果非要拿这两个东西来比较,那么当你在C中做与或非,那最多意味着你给CPU增加了些负担,消耗了些时间,可是对VHDL,你却需要从FPGA资源中拿一个实实在在的与或非门来实现.类似的,在C中似乎随意的定义一个变量,在VHDL都可能需要一个相应的逻辑电路与之对应.可以这样说,用VHDL(或其他硬件描述语言)来编程的过程,就是你设计逻辑电路的过程,简单的就是你用与或非,触发器等搭逻辑电路的过程,试想在你搭一个38译码器的过程中,你会考虑它是否并行运行的问题吗!当然,我相信,在你搭完一个38译码器时,你可能也会遗憾于你剩下的器件连搭一个24译码器也不够了!

* - 本贴最后修改时间:2006-11-14 19:38:11 修改者:fineamy

8楼: >>参与讨论
xqg119
楼上的讲得不错啊,我也理会到了,学到了
在此感谢大吓们

9楼: >>参与讨论
shbguo
关于并行处理
小弟看书上说
各个PROCESS之间是并行执行的
PROCESS内部指令是顺序执行的
那这样的话,
4楼的ziye123456大哥的说同在一个PROCESS能随便颠倒呢?
也就是说在同一个PROCESS里是有运算先后顺序的呀.
尽管在这个程序里可以颠倒,因为功能是一样的,但是换了别的呢?
小弟刚入门,望高人指点!!!


10楼: >>参与讨论
cnjiantian
要分清楚执行赋值和完成赋值之间的区别
VHDL中PROCESS中的语句是顺序语句,但它们具有并行运行的特征.这是因为,信号量的赋值是在遇到end PROCESS这条语句的时候完成的,也就是说,在PROCESS中,只执行赋值,而真正的完成赋值(更新信号量的值)是在一个系统延时后才完成的,这个和变量不一样,变量是立即完成赋值的.
对信号来说,执行赋值是一个过程,它具有顺序的特征,而完成赋值是一个结果,它的发生才真正具有硬件描述语言最本质的并行的特征.也看下面的例子:
PROCESS(clk)
x <= a;  --信号,执行赋值
y <= b;  --信号,执行赋值
z := c;  --变量,执行并完成赋值
end PROCESS    --系统延时后,此句执行,此时x,y的值才被更新

尽管变量z最后才被赋值,但是他的值更新的时间要比x,y早一个系统延时。

这也就明白了,为什么楼上那位老兄的那两个if语句可以颠倒了。

* - 本贴最后修改时间:2006-11-23 15:07:48 修改者:cnjiantian

11楼: >>参与讨论
carl.lee
支持7楼的楼主,很有道理
 
12楼: >>参与讨论
epeda
支持10楼!
 一般综合有意个默认的延迟时间,大概5~10ns,在这之间可以做很多的事情。

13楼: >>参与讨论
逗号
写hdl的code需要用硬件的视角看问题
写hdl code,不论是vhdl或者verilog,不能以以前软件的眼光看code。(相比较起来verilog和C更像。)应该换一个视角,用硬件的视角来看待问题。
vhdl的PROCESS和verilog的always block都是一个一个的电路。在一个模块中,一个一个这样的PROCESS和always block组成的功能块完成整个模块的逻辑功能。sensitive list就是这个电路的输入,如果电路的输入变化了,那么输出的值就会变化。换句话说,输出变化作为一个事件的话,敏感变量表中变量的值的变化导致这个事件的发生。举个例子,以时钟和reset信号为触发条件的PROCESS或者always block,代表了一个时序电路。在一个模块中,所有的这样的时序电路在时钟沿(一般是上升沿)和reset的下降沿(系统复位的时候)都会被赋予新值。表现在code中就是这些PROCESS和always block的code并行发生。

当然,这也要看情况而定。上述的是可综合的code,所谓的rtl。如果是行为级描述的testbench,不可综合的代码,就要特别注意语法细节。相比较而言,不可综合的verilog code确实和c code有些像。

我以前使用verilog,昨天刚刚开始学习vhdl。说的不对的地方,希望大家指出来。

BTW:4楼的code仿真过吗。PROCESS中的逻辑,没有reset,al和ah会不会没有初值,值始终是x。我觉得电路是没法工作的。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
Protel99:Duplicate Sheet Numbers是什么错误?
JTAG和EPCS的配置之后运行结果有区别吗?
pspice
如何判断MOSFET的三个管脚G、S、D阿?
众多硬件描述语言,你使用哪一种,该选用哪一种?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号