Chinaunix

标题: 《硬件软件接口》上有点不清楚 [打印本页]

作者: smalloc    时间: 2010-09-28 22:06
标题: 《硬件软件接口》上有点不清楚
本帖最后由 smalloc 于 2010-09-29 11:05 编辑

单时钟周期的指令设计是所有的动作在一个时钟内完成
而多周期可以配合流水线
那么分阶段的最小单元的限制条件是什么?
在一个时钟内完成的动作内部数据通路只能有且必有一次寄存?
作者: prolj    时间: 2010-09-29 10:46
忘了,我身边全是设计Arch的。
作者: smalloc    时间: 2011-01-02 22:51
本帖最后由 smalloc 于 2011-01-03 12:30 编辑

由这个帖子 http://linux.chinaunix.net/bbs/thread-1176129-1-1.html
回想起了这个帖子.上面的结论是成立的.
在中文版本189面讲的就是这个问题.
另外图5-4中说:状态单元的更新由时钟边缘触发,所以不可能在一个时钟周期内出现反馈.
考虑这个图.
------->[状态单元]--------------->(组合逻辑)----------------
|                                                                                    |
------------------------------------------------------------
但是这段话实际上与523面的描述不是精确符合
523面对D触发器的描述为主从锁存器(一般数字电路书上叫主从触发器),通过时钟上 下2个边缘控制.即在2个边缘都有电路变化.我觉得这个才是真实的不会反馈的原因.
考虑只有一级触发器时,首先边缘触发方式有2种,主要是控制数据有效传入时,分为元件延时和反馈延时,其效果就是在一个很短的水平电平期间允许输入.所以本质上和电平触发区别并不大.但是不管哪种方式.在输出后通过组合电路反映到输入,而输入通过边缘期间控制输出, 是不可能不发生反馈的.
520面也提到了一种时钟控制方法.用时钟决定何时数据有效.这实际上一种比较慢速的方法.可能数据有效无效要多个时钟周期精确控制.当然并不意味着只有一级的时候不会发生反馈.
作者: cjaizss    时间: 2011-01-03 01:20
一般单沿触发器,一个时钟周期只可以变一次;
双沿触发器,一个时钟可以变两次。
话说回来,我没有用过支持双沿的fpga
作者: smalloc    时间: 2011-01-03 12:56
上面说的改变2次.不是指触发器外面,而是指里面.因为存在主从结构.从外面看也只一次
比如假设是上升边沿触发,对与上图,从输出经过组合电路改变主锁存器,在下降边沿,主再改变从.
如果没有主从结构,仅在上升边沿完成所有的操作,很难想象不反馈.除非触发器输出的电信号载体是被"挤"到组合电路中去.并且一旦出去就不再影响.也就是单向的挤,还得有一点延时,当信号再从组合电路出来进入触发器输入.这个时候又要保证输出已经被钳断...
这个方式存在的一种可能电路是

------->[1边沿触发状态单元]----->[2边沿触发的锁存器]-------(组合逻辑)----->
这个结构就和主从触发器一样了.区别在于在一个时钟上升边沿要精确通过延时做到:边沿2先有效输入开启,边沿1再开启,在状态单元输出改变前边沿2禁止,也就是保证整个路不出现环.
作者: cjaizss    时间: 2011-01-03 22:44
本帖最后由 cjaizss 于 2011-01-03 22:45 编辑
上面说的改变2次.不是指触发器外面,而是指里面.因为存在主从结构.从外面看也只一次
比如假设是上升边沿触发 ...
smalloc 发表于 2011-01-03 12:56



    我说的双沿触发器改变两次当然是指该“寄存器”的值(输出)被改变两次,否则哪能叫双沿触发器?一般不会使用这样的触发器
作者: cjaizss    时间: 2011-01-04 22:44
我说的双沿触发器改变两次当然是指该“寄存器”的值(输出)被改变两次,否则哪能叫双沿触发器? ...
cjaizss 发表于 2011-01-03 22:44



    给一个比较简单的双沿触发器的架构,用verilog如下描述,由三个两路复用器搭成
module MUX(out,in0,in1,sel);
input in0,in1,sel;
output out;
assign out=sel?in1:in0;
endmodule

module DET_ff(D,clk,Q);
input D,clk;
output Q;
wire sig0,sig1;
MUX mux1(sig0,sig0,D,clk);
MUX mux2(sig1,D,sig1,clk);
MUX mux3(Q,sig0,sig1,clk);
endmodule
作者: cjaizss    时间: 2011-01-04 22:46
我们再来写一个testbench.
其中D,clk部分我用以下脚本生成
#!/bin/bash
clk=0
D=0
for((i=1;i<100;i++));do
        echo '#10;'
        let x=RANDOM%2
        if [ $x = 1 ];then
                let D=\!D;
                echo D="$D;"
        else
                let clk=\!clk;
                echo clk="$clk;"
        fi
done
之后生成的test bench如下:

  1. module test_bench_DET_ff;
  2. reg D,clk;
  3. wire Q;
  4. initial
  5. begin
  6. clk=0;
  7. D=0;
  8. #10;
  9. D=1;
  10. #10;
  11. D=0;
  12. #10;
  13. clk=1;
  14. #10;
  15. D=1;
  16. #10;
  17. D=0;
  18. #10;
  19. D=1;
  20. #10;
  21. clk=0;
  22. #10;
  23. clk=1;
  24. #10;
  25. clk=0;
  26. #10;
  27. D=0;
  28. #10;
  29. D=1;
  30. #10;
  31. D=0;
  32. #10;
  33. D=1;
  34. #10;
  35. D=0;
  36. #10;
  37. clk=1;
  38. #10;
  39. D=1;
  40. #10;
  41. clk=0;
  42. #10;
  43. D=0;
  44. #10;
  45. D=1;
  46. #10;
  47. clk=1;
  48. #10;
  49. clk=0;
  50. #10;
  51. clk=1;
  52. #10;
  53. D=0;
  54. #10;
  55. D=1;
  56. #10;
  57. D=0;
  58. #10;
  59. clk=0;
  60. #10;
  61. D=1;
  62. #10;
  63. D=0;
  64. #10;
  65. D=1;
  66. #10;
  67. clk=1;
  68. #10;
  69. D=0;
  70. #10;
  71. D=1;
  72. #10;
  73. D=0;
  74. #10;
  75. D=1;
  76. #10;
  77. clk=0;
  78. #10;
  79. clk=1;
  80. #10;
  81. D=0;
  82. #10;
  83. clk=0;
  84. #10;
  85. clk=1;
  86. #10;
  87. D=1;
  88. #10;
  89. clk=0;
  90. #10;
  91. clk=1;
  92. #10;
  93. clk=0;
  94. #10;
  95. D=0;
  96. #10;
  97. D=1;
  98. #10;
  99. D=0;
  100. #10;
  101. clk=1;
  102. #10;
  103. D=1;
  104. #10;
  105. clk=0;
  106. #10;
  107. D=0;
  108. #10;
  109. D=1;
  110. #10;
  111. clk=1;
  112. #10;
  113. D=0;
  114. #10;
  115. D=1;
  116. #10;
  117. clk=0;
  118. #10;
  119. D=0;
  120. #10;
  121. D=1;
  122. #10;
  123. D=0;
  124. #10;
  125. clk=1;
  126. #10;
  127. D=1;
  128. #10;
  129. D=0;
  130. #10;
  131. D=1;
  132. #10;
  133. clk=0;
  134. #10;
  135. clk=1;
  136. #10;
  137. D=0;
  138. #10;
  139. clk=0;
  140. #10;
  141. clk=1;
  142. #10;
  143. clk=0;
  144. #10;
  145. D=1;
  146. #10;
  147. D=0;
  148. #10;
  149. D=1;
  150. #10;
  151. D=0;
  152. #10;
  153. D=1;
  154. #10;
  155. clk=1;
  156. #10;
  157. clk=0;
  158. #10;
  159. clk=1;
  160. #10;
  161. D=0;
  162. #10;
  163. D=1;
  164. #10;
  165. D=0;
  166. #10;
  167. D=1;
  168. #10;
  169. clk=0;
  170. #10;
  171. clk=1;
  172. #10;
  173. clk=0;
  174. #10;
  175. clk=1;
  176. #10;
  177. D=0;
  178. #10;
  179. clk=0;
  180. #10;
  181. D=1;
  182. #10;
  183. D=0;
  184. #10;
  185. D=1;
  186. #10;
  187. D=0;
  188. #10;
  189. clk=1;
  190. #10;
  191. clk=0;
  192. #10;
  193. D=1;
  194. #10;
  195. clk=1;
  196. #10;
  197. clk=0;
  198. #10;
  199. clk=1;
  200. #10;
  201. clk=0;
  202. #10;
  203. clk=1;
  204. #10;
  205. clk=0;

  206. $stop();   
  207. end
  208. DET_ff A(D,clk,Q);
  209. endmodule
复制代码

作者: cjaizss    时间: 2011-01-04 22:50
modlesim仿真结果如下:

作者: cjaizss    时间: 2011-01-05 10:18
modlesim仿真结果如下:
cjaizss 发表于 2011-01-04 22:50



    带复位的双沿触发
module MUX(out,in0,in1,sel);
input in0,in1,sel;
output out;
assign out=sel?in1:in0;
endmodule

module DET_ff(D,clk,rst,Q);
input D,clk,rst;
output Q;
wire sig0,sig1;
wire _sig0,_sig1;
parameter INIT_VALUE_AFTER_RESET=0;
assign sig0=rst?INIT_VALUE_AFTER_RESET:_sig0;
assign sig1=rst?INIT_VALUE_AFTER_RESET:_sig1;
MUX mux1(_sig0,sig0,D,clk);
MUX mux2(_sig1,D,sig1,clk);
MUX mux3(Q,sig0,sig1,clk);
endmodule
作者: smalloc    时间: 2011-01-05 12:07
本帖最后由 smalloc 于 2011-01-05 12:13 编辑

回复 7# cjaizss


    不动verilog语法,多路选择器是纯组合电路吗?
如果是.从图上看确实出现边沿触发的效果,不知道产生的? 而且时钟不跳变,即使D变化也不会影响输出.

多路的逻辑图是

D------[与门]---------------------
           |                                   |
clk------                              -------
clk~--------                        | 或门 |----------
                |                         -------             |
                |                           |                    |
       --- [与门]-----------------                     |
      |                                                          |
      -------------------------------------------
作者: cjaizss    时间: 2011-01-05 16:25
回复  cjaizss


    不动verilog语法,多路选择器是纯组合电路吗?
如果是.从图上看确实出现边沿触发的 ...
smalloc 发表于 2011-01-05 12:07



    多路选择当然是纯组合电路,之所以会产生时序,是因为有反馈
作者: cjaizss    时间: 2011-01-05 16:38
多路选择当然是纯组合电路,之所以会产生时序,是因为有反馈
cjaizss 发表于 2011-01-05 16:25



    那个电路用原理图来画长这样
作者: cjaizss    时间: 2011-01-05 16:42
那个电路用原理图来画长这样
cjaizss 发表于 2011-01-05 16:38



    所谓两路复用,
   就是说,out与D0,D1,sel的关系如下:
   out=sel?D1 : D0
   用与或非门来表示
  out=(sel&D1)|( (!sel) & D0)
作者: smalloc    时间: 2011-01-05 17:22
本帖最后由 smalloc 于 2011-01-05 17:46 编辑

回复 14# cjaizss


    我那个字符图和这个是一样的意思
但是我没发现能产生边沿触发效应.

反馈当然有.就是对我上面的那个字符图.当CLK为低电平的时候有sel的回路.但是一个与门连接一个或门.由于D那路输入无效,省略后2个门相当与维持同一个值,就是原先CLK为高时输入的D的值.

但这个就是和普通D触发器一样.当然在一个时钟周期改变了2次
却算不上边沿触发. 边沿触发的特点是输入只在改变的一瞬间影响反馈环路.目的是为了防止环路在开状态变为闭合时D输入的改变或抖动对环路有影响.

看来我的概念之前有误: D触发器叫跳沿触发器或者叫同步触发,而不能叫边沿触发器,2个并不相同
作者: cjaizss    时间: 2011-01-05 23:24
回复  cjaizss


    我那个字符图和这个是一样的意思
但是我没发现能产生边沿触发效应.

反馈当然有 ...
smalloc 发表于 2011-01-05 17:22



    我真是晕死,那你画一下你所谓的“边沿触发器”的波形图吧,这个才可以唯一说明问题
作者: cjaizss    时间: 2011-01-06 00:30
另外,D触发器的全称叫:
positive-edge-triggered D flip-flop
作者: smalloc    时间: 2011-01-06 00:44
本帖最后由 smalloc 于 2011-01-06 00:51 编辑

边沿触发器 在数字电路上是这样描述的.
虽然它确实符合在边沿发生翻转,但是有个新的独立的特性 ,D触发器确实也在某跳沿发生翻转,但却不能算是"边沿触发器"
在正跳沿前接受信号,正跳沿时发生翻转,正跳沿后输入被关闭. 它解决的不是逻辑问题.而是延时抖动问题
你的电路只考虑我11楼画的那部分.现在说明下不符合第一条的原因是因为它必须在负跳沿前很长一段时间前就准备好.
假设时钟为正跳变到负前一瞬间,D输入由1边为0.按照跳变触发的规则时钟跳变后输出当然为0而不是1.
但是时钟跳变的时候或门和下面的与门输出都为1--它们还没来得及边成0,这个时候再经过或门后输出一直为1,而不是0,这与上面的规则相反.
而"边沿触发器"就是为了解决这类门级延时误差的.
作者: cjaizss    时间: 2011-01-06 00:58
边沿触发器 在数字电路上是这样描述的.
虽然它确实符合在边沿发生翻转,但是有个新的独立的特性 和D触发器, ...
smalloc 发表于 2011-01-06 00:44



    我明白你的意思了,你的意思是必须要用时钟改变作为内部相关信号改变的依据。但这也依然是边沿触发器,你不应随意修改其名称。当然,我们可以修改其电路,使得让时钟作为改变最终决定内部信号的因素。
作者: cjaizss    时间: 2011-01-06 01:07
我明白你的意思了,你的意思是必须要用时钟改变作为内部相关信号改变的依据。但这也依然是边沿触 ...
cjaizss 发表于 2011-01-06 00:58



    所谓D触发器是两个D latch的级联
   一个D latch的输出接到另一个D latch的输入,两个用相反的时钟,其实,即使在再简单的时序电路中,你都可以分析出极端的情况,你无法构造出电路来永远消除极端情况。在dff中,如果反向器时沿或者走线过长,那么问题是严重的
作者: cjaizss    时间: 2011-01-06 01:33
由这个帖子
回想起了这个帖子.上面的结论是成立的.
在中文版本189面讲的就是这个问题.
另外图5-4中说:状 ...
smalloc 发表于 2011-01-02 22:51



    主从触发器和边沿触发器概念是不同的,边沿触发器的时钟发生改变的时候,其输出或者在某些输入下不改变,或者完全取决于输入,而主从式不完全取决于当前输入




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2