信号传输模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end if; end if;
End process;
End process;
必须等于Delta延时
• 信号赋值延时,不能少于Delta延时,这 是前面所说的调度顺序问题能得到有效 解决的保证; • 此外,信号赋值的延时,不可能大于一 个Delta延时(即子仿真周期的时间),因 为延时时间到达,目标信号点发生有效 更新后,才可能激活下一个子仿真周期。
电子科技大学
present
1
0
1
a
clk
U1
b
U2
c
考虑模块合并的情况
当仿真程序执行这条 • Process( clk ) 语句之后,a的新的值 • Begin 并不会立即到达b。 • if( clk’event and clk = ‘1’ ) then • b <= a; • c <= b; t a b c • end if; 0 0 1 last • End process;
结果:a = ‘0’。
•这两个赋值实际上是 “并行”(也可以说“并 发”)的。 •但是由于process内语句 运行的顺序性,后者将 比前者“晚”到达一个 很微小的时间。
电子科技大学
进程内的信号赋值: 顺序执行,并行赋值
• • • • • • 例1 : Process Begin a <= ‘1’; a <= ‘0’; End process;
关于组合进程的结论
• Process( a, b ) • Begin • b <= a; • c <= b; • End process;
•组合电路进程中,所有 被读取的信号,都应该 放到敏感信号列表中。 •当输入发生变化时,组 合进程有可能连续多次 被调度。
电子科技大学
关于信号赋值完成(到达)时间 的说法
行为仿真
回头看看组合电路进程的情况
• Process( a, b ) • Begin • b <= a; • c <= b; • End process;
a
b c
再次强调:当a发生 变化时,该进程将 被调度两次,即a 的变化激活了两个 子仿真周期。这样 保证了a的值能顺 利传播到c。
电子科技大学
时序仿真
b c 行为仿真
电子科技大学
假设敏感信号量遗漏
• Process( a ) • Begin • b <= a; • c <= b; • End process;
a
b c A发生一次,该 process只被调度 一次,造成行为仿 真结果错误。 而时序仿真仍然是 正确的(上节课分析过)
电子科技大学
行为仿真
电子科技大学
present
1
0
c 1 1
a
clk
U1
b
U2
c
考虑模块合并的情况
• Process( clk ) • Begin • if( clk’event and clk = ‘1’ ) then • b <= a; • c <= b; t a b • end if; 0 0 last • End process;
例如
• 我们认为前面例子中,任时刻被同时激 活的进程之间是并行(严格地说是“并 发”)执行的。 • 那么思考:如何用c语言来实现前面所说 的时序进程和组合进程,以及这些进程 的调度? • C语言实现时,如何处理信号赋值的 Delta延时?
电子科技大学
进程内的信号赋值: 顺序执行,并行赋值
• • • • • • 例1 : Process Begin a <= ‘1’; a <= ‘0’; End process;
电子科技大学
present
1
0 1
c 1 1 0
假如给时序进程添加冗余敏感 信号……
• Process( b, clk ) • Begin • if( clk’event and clk = ‘1’ ) then • b <= a; •必须保证process不能因 • c <= b; 为b的改变而得到调度。 • end if; •可见,时钟沿条件判断的 • End process; 值只在第一个子仿真周期
可编程ASIC
信号传输模型
电子科技大学
回顾上一节课,发生了什么
a
U1 clk /* 敏感信号为(clk) */ FunctU3() { if( ( clklast == 0 ) && ( clk == 1 ) ) { b = a; 交换顺序! c = b; } }
电子科技Biblioteka Baidu学
b
U2
c
此时仿 真出错, 与实际 不符!
假设敏感信号量遗漏
• Process( a ) • Begin • b <= a; • c <= b; • End process;
a
b c 行为仿真
电子科技大学
假设敏感信号量遗漏
• Process( a ) • Begin • b <= a; • c <= b; • End process;
a
结果:x <= b XOR c; y <= b XOR c;
电子科技大学
VHDL中的变量
• • • • • • • • 与c语言的变量一样,赋值是立即有效的。 Process( a, b, c ) – 注意d为变量(用variable声明) Begin d := a; x <= c XOR d; d := b; 结果: y <= c XOR d; x <= a XOR c; End prcoess; y 电子科技大学 <= b XOR c;
} } •必须等到 functU2被调 度之后。
解决方案分析(4)
a
U1
b
U2
c
•假设先调度 functU2再调 clk 度functU1。 Void functU1() Void functU2() 分析仍然同 前。 { { if(rising_edge(clk)) if(rising_edge(clk)) b = a;
end if;
c <= b;
end if;
End process;
End process;
VHDL解决方案----Delta延时
a
U1
b
U2
c
•很容易发现, 信号赋值的延 clk 时,正好应该 U1:Process(clk) U2:Process(clk) 等于前面所说 的一个子仿真 begin begin 周期的时间---if(rising_edge(clk)) if(rising_edge(clk)) Delta延时。 b <= a; c <= b;
• 说法1:大部分资料上说的是,信号赋值是在 进程退出时完成(到达)。 • 说法2:而部分资料说的是,信号赋值是在当 前的子仿真周期结束时完成(到达)。 • 分析:说法1是从硬件的角度来看问题,其依 据的前提是,进程是并行执行的; • 而说法2是从底层的软件仿真来看问题,其依 据的前提是,进程是串行调度(“并发”的本 质)的。
U1 U2
a
b
c
}
}
解决方案分析(2)
进程调度是串行 的,而硬件运行 clk 是并行的。从软 件的角度上看, Void functU1() Void functU2()进程内的信号传 { { 输不能“过快”, if(rising_edge(clk)) if(rising_edge(clk)) 以至于过早地传 输到目的地。 b = a; c = b;
U1 U2
a
b
c
}
}
解决方案分析(3)
a
U1 clk
b
U2
c
Void functU1() Void functU2() { { if(rising_edge(clk)) if(rising_edge(clk)) b = a;
} }
出现上述问题的 根本原因在于, 我们还没有考虑 到信号传输中的 延时
c
解决方案分析(1)
a
U1 clk
b
U2
c 想想如何解决调 度顺序的问 题…… Void functU2()
Void functU1() { { if(rising_edge(clk)) if(rising_edge(clk)) b = a;
} }
c = b;
解决方案分析(1)
一种好的硬件描 述语言,或者一 clk 种好的硬件建模 方法,应该允许 Void functU1() Void functU2()设计者用任何顺 { { 序描述或者调度 if(rising_edge(clk)) if(rising_edge(clk)) 各个模块的进程。 b = a; c = b;
电子科技大学
从现在开始
• 课程开始进入设计阶段。这意味着,学习时, 思维方法应该从软件模型转向硬件模型。 • 以后的说法,大部分是基于第一种假设(进程 并行)。也就是,你可以并且应该使用纯粹的 硬件思维来进行代码分析和代码设计。 • 但是你应该时刻注意使用底层的软件仿真思维, 来思考vhdl语法背后的运行机制,这不仅可以 很好地理解HDL,而且有助于你纯熟地使用任 何一门语言,或者使用多语言配合来进行系统 建模/仿真,特别是软件和硬件的协同建模/仿 真。 电子科技大学
电子科技大学
为真。
回头看看组合电路进程的情况
• Process( a, b ) • Begin • b <= a; • c <= b; • End process;
a
b c
再次强调:当a发生 变化时,该进程将 被调度两次,即a 的变化激活了两个 子仿真周期。这样 保证了a的值能顺 利传播到c。
电子科技大学
结果:a = ‘0’。
•在实际设计中,应该尽 量避免出现这种对信号 多次赋值覆盖; •这意味着,尽量不要使 用书上的在process内部 进行信号初始化的方法 (后面将详细讲述)。
电子科技大学
进程内的信号赋值: 顺序执行,并行赋值
• • • • • • • • 例2 : Process(a,b,c,d) Begin d <= a; x <= c XOR d; d <= b; y <= c XOR d; End process;
c = b;
解决方案分析(4)
a
U1 clk
b
U2
c
Void functU1() Void functU2() { { if(rising_edge(clk)) if(rising_edge(clk)) b = a;
} }
c = b;
信号传输的延时
a
b
c

假设信号从a直接传输到c,中间经过b。
• 当a处的电信号往b传输的同时,b处的信号也在往 c传输。
} }
c = b;
VHDL解决方案
a
U1
b
U2
c
•Vhdl在信号 赋值问题上, clk 引入了一个 U1:Process(clk) U2:Process(clk) 延时的概念。 begin begin if(rising_edge(clk)) if(rising_edge(clk)) b <= a;
电子科技大学
present
1
0
1
a
clk
U1
b
U2
c
考虑模块合并的情况
同样执行这条语句后, • Process( clk ) b的值也不会立即传 • Begin 输到达c。 • if( clk’event and clk = ‘1’ ) then • b <= a; • c <= b; t a b c • end if; 0 0 1 last • End process;
解决方案一
• 可以规定设计者严格按照 c = b; b = a; 的顺序,即“从后级到前级”的顺序描述 寄存器队列。
a
clk
电子科技大学
U1
b
U2
c
但是
• 设计者在实际设计当中如何时刻注意寄 存器的先后级顺序? • 特别是设计者如何去描述如下图所示的 循环移位寄存器?
a
clk
U1
b
电子科技大学
U2 Preset
电子科技大学
present
1
0
1
a
clk
U1
b
U2
c
考虑模块合并的情况
• Process( clk ) • Begin • if( clk’event and clk = ‘1’ ) then • b <= a; • c <= b; t a b • end if; 0 0 last • End process;
• 即使假定传输延时为0(很理想的情况),但是任意 时刻(或者说任意瞬间),c所获得的信号绝对不是此时b 所获得的信号,更不会是a的信号(虽然它们的值有可 能是完全相同的)。
电子科技大学
解决方案分析(4)
a
U1 clk
b
U2
c
•假设先调度 functU1再调 度functU2。
Void functU1() Void functU2() •functU1调度 { { 完毕后,a的 if(rising_edge(clk)) if(rising_edge(clk)) 新值不能立 即传输到b。 b = a; c = b;
电子科技大学
a
clk
U1
b
U2
c
考虑模块合并的情况
• Process( clk ) •这个进程的行为必须 • Begin 跟前面所说的双进程的 行为一样。 • if( clk’event and clk = ‘1’ ) then • b <= a; • c <= b; t a b c • end if; 0 0 1 last • End process;
相关文档
最新文档