|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
Vhdl跟C的主要区别是并行,请求高手讲解 |
作者:籁儿 栏目:EDA技术 |
说来惭愧,之前看了一个帖子: 发现vhdl真不好理解 原来用c, 一切逻辑都是那么清楚, 现在用vhdl本来看着很正确的逻辑, 却不行。 也没有书讲为什么, 怎么办呀? 我竟幼稚的回答: 在我看来,C跟vhdl事实上是一样的 只是vhdl中用 end 代替了C 中的 {} 不知道这种说法是不是很肤浅 然后还有一点就是 vhdl里的PROCESS: 对于敏感量的问题,我始终有点不理解 曾经有一次,提示PROCESS太复杂而报错 好像是敏感量不能嵌套 不知道是为什么 后来看到好多网友的说法,才知道主要区别在于 并行 但说实话,我真的不是很明白,希望有高人指点 |
2楼: | >>参与讨论 |
作者: 籁儿 于 2006/10/13 15:43:00 发布:
没有? |
3楼: | >>参与讨论 |
作者: 籁儿 于 2006/10/13 15:44:00 发布:
请求高手解答 |
4楼: | >>参与讨论 |
作者: ziye123456 于 2006/10/17 15:27:00 发布:
希望会满意! 我自己编的六十进制简单的程序.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楼: | >>参与讨论 |
作者: 籁儿 于 2006/10/17 18:46:00 发布:
不好意思 可能是咱俩用的软件不一样 我从来没见过rising_edge 和 分开的1,2if 或者我才只是新手,根本没学到那么深的东西 怎么办 |
6楼: | >>参与讨论 |
作者: buqibushe 于 2006/11/12 10:04:00 发布:
!!! rising_edge()是ieee.std_logic_1164中定义的,只适合于std_logic/vector,不适于bit/vector |
7楼: | >>参与讨论 |
作者: fineamy 于 2006/11/14 19:30:00 发布:
为什么老是要和C扯到一块? 我是新手,谈谈我的理解. 两个风马牛不相关的东西为什么老是往一块扯.VHDL或VERILOG HDL属于硬件行为描述语言,顾名思义,就是对硬件如何动作,如何响应等各种信号的描述,实际上,对所要实现硬件功能本身(包括时序,响应顺序,电平高低,状态序列)的通彻理解,那么依据这些行为使用描述语言进行描述就是非常自然的事情,并不需要刻意的去考虑如何"并行",而所谓的与C区别的"并行性",那也是硬件特性决定的. 如果非要拿这两个东西来比较,那么当你在C中做与或非,那最多意味着你给CPU增加了些负担,消耗了些时间,可是对VHDL,你却需要从FPGA资源中拿一个实实在在的与或非门来实现.类似的,在C中似乎随意的定义一个变量,在VHDL都可能需要一个相应的逻辑电路与之对应.可以这样说,用VHDL(或其他硬件描述语言)来编程的过程,就是你设计逻辑电路的过程,简单的就是你用与或非,触发器等搭逻辑电路的过程,试想在你搭一个38译码器的过程中,你会考虑它是否并行运行的问题吗!当然,我相信,在你搭完一个38译码器时,你可能也会遗憾于你剩下的器件连搭一个24译码器也不够了! * - 本贴最后修改时间:2006-11-14 19:38:11 修改者:fineamy |
8楼: | >>参与讨论 |
作者: xqg119 于 2006/11/16 15:57:00 发布:
楼上的讲得不错啊,我也理会到了,学到了 在此感谢大吓们 |
9楼: | >>参与讨论 |
作者: shbguo 于 2006/11/21 23:31:00 发布:
关于并行处理 小弟看书上说 各个PROCESS之间是并行执行的 PROCESS内部指令是顺序执行的 那这样的话, 4楼的ziye123456大哥的说同在一个PROCESS能随便颠倒呢? 也就是说在同一个PROCESS里是有运算先后顺序的呀. 尽管在这个程序里可以颠倒,因为功能是一样的,但是换了别的呢? 小弟刚入门,望高人指点!!! |
10楼: | >>参与讨论 |
作者: cnjiantian 于 2006/11/23 14:54:00 发布:
要分清楚执行赋值和完成赋值之间的区别 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 于 2006/11/29 23:05:00 发布:
支持7楼的楼主,很有道理 |
12楼: | >>参与讨论 |
作者: epeda 于 2006/11/30 21:06:00 发布:
支持10楼! 一般综合有意个默认的延迟时间,大概5~10ns,在这之间可以做很多的事情。 |
13楼: | >>参与讨论 |
作者: 逗号 于 2006/12/1 15:38:00 发布:
写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。我觉得电路是没法工作的。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |