BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #8509同步于 2009/1/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

[合集] 【发问】vhdl移位寄存器问题~

pooh1949
2009/1/15镜像同步2 回复
☆─────────────────────────────────────☆ done (done) 于 (Sun Oct 19 19:06:47 2008) 提到: temp(0)<=di; for i in 0 to 6loop temp(i+1)<=temp(i); end loop; 移位寄存器里的一段代码,这样循环不是把temp逐个覆盖了么?? 如果说只表示信号连接,那在一个clk内信号逐个触发器传递不也是有顺序的么?? 并行语句映射在电路上该怎么理解呢?? 等待达人解惑~~~ 谢了~~ ☆─────────────────────────────────────☆ hihuang (江淮人家@EE不舍$hi huang|Q8之皮丘|) 于 (Sun Oct 19 23:15:09 2008) 提到: 额,貌似这个我们ASIC课上刚讲过类似的。。。。可惜我也没弄明白。。。。 【 在 done (done) 的大作中提到: 】 : temp(0)<=di; : for i in 0 to 6loop : temp(i+1)<=temp(i); : ................... ☆─────────────────────────────────────☆ Gotcha () 于 (Mon Oct 20 09:06:39 2008) 提到: 并行是在进程之间并行,但是进程中语句是顺序执行的,我的理解是编译器编译的时候顺序执行,但是综合出来的电路不会顺序执行,一个clk时钟内,此移位寄存器执行的动作就是向左移动了一位。 ☆─────────────────────────────────────☆ ericyosho (ericyosho) 于 (Mon Oct 20 09:32:49 2008) 提到: 我只是依稀有点印象,好像要放在一个什么段里面的语句,是有时序顺序的,是顺序执行的。 其他的都是并行执行的,综合出来以后就是逻辑变换,直接生效,没有时序。 ☆─────────────────────────────────────☆ Ecook (Ecook) 于 (Thu Oct 23 23:01:59 2008) 提到: 这个问题我来回答。不过我也是新手,恰好前几天看到了这个问题。 最主要的原因是信号的赋值是需要一段延迟时间的,若temp(i)被赋值为temp(i-1),由于需要一段赋值延时时间,所以在这段时间内,temp(i+1)被赋值为temp(i)的前一个值,于是就实现了寄存器的功能。 不知我说明白了没。如果还不懂的话,可以上这个网站看一下http://blog.21ic.com/user1/1028/archives/2006/19016.html ☆─────────────────────────────────────☆ done (done) 于 (Thu Oct 23 23:16:18 2008) 提到: [color=#B22222]【 在 Ecook 的大作中提到: 】 : 这个问题我来回答。不过我也是新手,恰好前几天看到了这个问题。 : 最主要的原因是信号的赋值是需要一段延迟时间的,若temp(i)被赋值为temp(i-1),由于需要一段赋值延时时间,所以在这段时间内,temp(i+1)被赋值为temp(i)的前一个值,于是就实现了寄存器的功能。 : 不知我说明白了没。如果还不懂的话,可以上这个网站看一下http://blog.21ic.com/user1/1028/archives/2006/19016.html [color=#FAEBD7][color=#FAEBD7][color=#FAEBD7][color=#DC143C] “即整体描述了一个信号是如何在节点之间传递的,又描述出每个时钟的信号都是如何在节点之间动作的,这就是HDL的魅力吧!~”[/[/color][/color][/color]color] 那就是说并行语句是要结合具体的电路中的时延来完成对硬件行为的正确描述的(是这么理解的吧)~~~这么一想貌似就有点茅塞顿开的意思了,恩,并行语句~~ 非常感谢解惑,已经几天了还有人想着~~ 待我我在去翻翻那个链接,看看还有什么新发现~~~ ☆─────────────────────────────────────☆ Chongchong (永远消失的虫虫) 于 (Sun Nov 2 02:39:34 2008) 提到: 如果你这段程序是在时钟信号的控制下执行,例如上升沿,或者下降沿,那么在下一次始终跳变之前,tmp中的各项值是不会变化的。因为clk是你的敏感变量,只有时钟变化才会触发这段程序运行。 移位寄存器就是想一个方向覆盖的逻辑结构。一种很快的存储介质。 呵呵,不知说的对不对,欢迎批评指正。 ☆─────────────────────────────────────☆ done (done) 于 (Sun Nov 2 21:14:45 2008) 提到: 【 在 Chongchong 的大作中提到: 】 : 如果你这段程序是在时钟信号的控制下执行,例如上升沿,或者下降沿,那么在下一次始终跳变之前,tmp中的各项值是不会变化的。因为clk是你的敏感变量,只有时钟变化才会触发这段程序运行。 : 移位寄存器就是想一个方向覆盖的逻辑结构。一种很快的存储介质。 : 呵呵,不知说的对不对,欢迎批评指正。 主要问题是一开始完全把hdl完全按程序理解,把temp类比成数组了,看了前面那个博文里就意识到hdl是描述性的语言,赋值不是按照语句顺序进行,而是在process结束是一起给值,应该就是你说的一个clk内吧~~
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
luckyboy120机器人#1 · 2009/1/16
FOR_LOOP语句是VHDL顺序语句的一种,但综合后将变成并行的电路结构。即硬件语言描述上的顺序描述被综合成硬件模块的重复。 因此,上述语句相当于:temp(0)<=di;temp(1)<=temp(0);temp(2)<=temp(1);......temp(7)<=temp(6); VHDL中有信号赋值和变量赋值两种赋值方式,这两种赋值方式有着本质区别: 信号赋值是非阻塞的,即具有“非立即性”,多个信号赋值语句并列时,必须等时钟沿过后多个信号赋值语句同时执行,书写在前的语句执行结果不影响后面语句的执行。 变量赋值语句是阻塞的,即具有“立即性”,多个变量赋值语句并列时,当时钟沿到来时,各条语句按书写顺序执行,书写在前的语句执行结果将作为后面语句的输入执行。 上述语句为信号赋值语句,因此当一个时钟沿到来时,上述等效的8条语句同时赋值,即把di赋给temp(0),temp(0)的下一个状态为di,而把当前状态的temp(0)赋给temp(1),temp(1)的下一个状态为temp(0),以此类推,则当前状态下的temp(0)~temp(7)将同时变为下一状态的temp(1)~temp(7),原来的temp(7)被移出,temp(0)被赋予di。因此,综合结果为一串串联的D触发器。因此能实现移位寄存器的功能。(注意时钟沿瞬间的当前状态和下一个状态) 若把上述语句中的信号赋值语句改为变量赋值语句,则将无法实现移位寄存器。这是因为,变量赋值的“立即性”,temp(0)赋给temp(1),又立刻被赋给temp(2),以此类推,最终等效为temp(7):=di;。因此,综合结果为一个D触发器。
mjia机器人#2 · 2009/1/19
画个图就比较清楚了。。