《硬件软件接口》上有点不清楚

发布于 2022-09-08 01:08:24 字数 177 浏览 29 评论 9

本帖最后由 smalloc 于 2010-09-29 11:05 编辑

单时钟周期的指令设计是所有的动作在一个时钟内完成
而多周期可以配合流水线
那么分阶段的最小单元的限制条件是什么?
在一个时钟内完成的动作内部数据通路只能有且必有一次寄存?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

会傲 2022-09-19 18:39:49

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

番薯 2022-09-19 18:27:41

modlesim仿真结果如下:

未命名.JPG (16.48 KB, 下载次数: 5)

下载附件

2011-01-04 22:51 上传

聆听风音 2022-09-19 18:26:22

我们再来写一个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

复制代码

酸甜透明夹心 2022-09-19 17:19:26

我说的双沿触发器改变两次当然是指该“寄存器”的值(输出)被改变两次,否则哪能叫双沿触发器? ...
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

梦里梦着梦中梦 2022-09-19 13:56:58

本帖最后由 cjaizss 于 2011-01-03 22:45 编辑

上面说的改变2次.不是指触发器外面,而是指里面.因为存在主从结构.从外面看也只一次
比如假设是上升边沿触发 ...
smalloc 发表于 2011-01-03 12:56

    我说的双沿触发器改变两次当然是指该“寄存器”的值(输出)被改变两次,否则哪能叫双沿触发器?一般不会使用这样的触发器

做个ˇ局外人 2022-09-19 13:49:18

上面说的改变2次.不是指触发器外面,而是指里面.因为存在主从结构.从外面看也只一次
比如假设是上升边沿触发,对与上图,从输出经过组合电路改变主锁存器,在下降边沿,主再改变从.
如果没有主从结构,仅在上升边沿完成所有的操作,很难想象不反馈.除非触发器输出的电信号载体是被"挤"到组合电路中去.并且一旦出去就不再影响.也就是单向的挤,还得有一点延时,当信号再从组合电路出来进入触发器输入.这个时候又要保证输出已经被钳断...
这个方式存在的一种可能电路是

------->[1边沿触发状态单元]----->[2边沿触发的锁存器]-------(组合逻辑)----->
这个结构就和主从触发器一样了.区别在于在一个时钟上升边沿要精确通过延时做到:边沿2先有效输入开启,边沿1再开启,在状态单元输出改变前边沿2禁止,也就是保证整个路不出现环.

满栀 2022-09-19 10:28:39

一般单沿触发器,一个时钟周期只可以变一次;
双沿触发器,一个时钟可以变两次。
话说回来,我没有用过支持双沿的fpga

万水千山粽是情ミ 2022-09-18 22:59:43

本帖最后由 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面也提到了一种时钟控制方法.用时钟决定何时数据有效.这实际上一种比较慢速的方法.可能数据有效无效要多个时钟周期精确控制.当然并不意味着只有一级的时候不会发生反馈.

凶凌 2022-09-12 15:11:33

忘了,我身边全是设计Arch的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文