亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 32990 | 回復: 32
打印 上一主題 下一主題

[數(shù)字設計]抓外部信號的沿 [復制鏈接]

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-10-19 23:18 |只看該作者 |倒序瀏覽
以下用verilog描述,且只考慮信號上升沿,而下沿同理。
假設外部信號為sig,我們首先想到的會是
always@(posedge sig)
   ...
似乎沒什么錯,但這有很多的問題:
第一點,外部信號可能會有很多的毛刺,并非真正的上沿;
第二點,如此設計導致觸發(fā)器所用時鐘彼此不一致,特別對于像fpga之類的東西,綜合雖然可以,但并不好。
其中,第一點是致命的。

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
2 [報告]
發(fā)表于 2010-10-19 23:18 |只看該作者
于是怎么辦呢?我們還是要用到系統(tǒng)時鐘,緩存一道試下,在上沿處生成單脈寬的一個信號。
module catch_posedge(rst,clk,sig_posedge,sig);
input rst,clk,sig;
output  sig_posedge;
reg sig_reg;
always@(posedge rst or posedge clk)
if(rst)
       sig_reg<=1'b1;
else
       sig_reg<=sig;
assign sig_posedge = !sig_reg & sig;
endmodule

似乎看起來很好了,但其實也只是五十笑百,利用一個外部可能有毛刺的信號來作為組合輸出,很危險,出現(xiàn)真正意思上的上沿(并非毛刺)的時候,其附近如果有毛刺,那么就有抓不到的危險。

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
3 [報告]
發(fā)表于 2010-10-19 23:22 |只看該作者
全部用內(nèi)部寄存器來組合輸出應該是比較好的選擇。
module catch_posedge(rst,clk,sig_posedge,sig);
input rst,clk,sig;
output  sig_posedge;
reg sig_reg,sig_reg2;
always@(posedge rst or posedge clk)
if(rst)
       {sig_reg,sig_reg2}<=2'b11;
else
       {sig_reg,sig_reg2}<={sig,sig_reg};
/*以上寫法我多少有點偷工減料,不推薦這么寫,還是分開寫比較好,好的代碼習慣是需要的*/
assign sig_posedge = !sig_reg2 & sig_reg;
endmodule

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
4 [報告]
發(fā)表于 2010-10-19 23:25 |只看該作者
本帖最后由 cjaizss 于 2010-10-21 13:16 編輯

然后,再濾去一次低電平下的毛刺:
module catch_posedge(rst,clk,sig_posedge,sig);
input rst,clk,sig;
output  sig_posedge;
reg [2:0]sig_reg;
always@(posedge rst or posedge clk)
if(rst)
       sig_reg[2:0]<=3'b111;
else
       sig_reg[2:0]<={sig_reg[1:0],sig};
assign sig_posedge = sig_reg==3'b011;
endmodule
基本成了

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
5 [報告]
發(fā)表于 2010-10-19 23:33 |只看該作者
至于“用一個外部可能有毛刺的信號來作為組合輸出,很危險”這一點,請相信我,我有過慘痛的教訓。

論壇徽章:
0
6 [報告]
發(fā)表于 2010-10-20 09:01 |只看該作者
lz 牛,這樣在實際工作中的體會很有實際意義,遠比一些紙上談兵有實際意義.

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
7 [報告]
發(fā)表于 2010-10-20 09:18 |只看該作者
對于其原因,我的電腦截圖不知為什么出了問題,所以無法截圖了.有興趣的用modelsim仿真一下以下的電路,仔細對照一下波形圖,再想想或許就明白了.

  1. `timescale 1ns/1ps
  2. module reset_module_test(
  3.                                 gpio,
  4.                                 clk,
  5.                                 rst,
  6.                                 io_out
  7.     );
  8. input gpio,clk,rst;
  9. output io_out;

  10. parameter REG_WILDTH=6;


  11. reg io_out;
  12. reg [REG_WILDTH-1:0]gpio_reg;
  13. wire negedge_gpio, posedge_gpio;


  14. assign negedge_gpio = (&(gpio_reg[REG_WILDTH-1:REG_WILDTH/2])) & (!(|(gpio_reg[REG_WILDTH/2-1:0])));
  15. assign posedge_gpio = (!(|(gpio_reg[REG_WILDTH-1:REG_WILDTH/2]))) &  (&(gpio_reg[REG_WILDTH/2-1:0]));


  16. always@(posedge rst or posedge clk)
  17. if(rst)
  18.   gpio_reg <= 0;
  19. else
  20.         gpio_reg <= {gpio_reg[REG_WILDTH-2:0], gpio};
  21.        
  22. always@(posedge rst or posedge clk)
  23. if(rst)
  24.   io_out <= 1'b0;
  25. else
  26.   begin
  27.         if(negedge_gpio)
  28.                 io_out <= 1'b0;
  29.         else if(posedge_gpio)
  30.                 io_out <= 1'b1;
  31.   end

  32. endmodule


  33. module testbench
  34.   ();
  35.   reg clk,gpio,rst;
  36.   wire io_out;
  37.   reset_module_test reset_module_inst(
  38.                                 gpio,
  39.                                 clk,
  40.                                 rst,
  41.                                 io_out
  42.     );
  43.     initial
  44.     forever
  45.     begin
  46.     clk=0;
  47.     #2.5;
  48.     clk=1;
  49.     #2.5;
  50.     end
  51.    
  52.     initial
  53.       begin
  54.         rst=0;
  55.         #7;
  56.         rst=1;
  57.         #20;
  58.         rst=0;
  59.       end
  60.       
  61.     initial
  62.       begin
  63.         gpio = 1;
  64.         #1000;
  65.         gpio=0;
  66.         #100;
  67.         gpio=1;
  68.         #2000;
  69.         gpio=0;
  70.         #99;
  71.         gpio=1;
  72.         #4000;
  73.         gpio=0;
  74.         #12;
  75.         gpio=1;
  76.         #4000;
  77.         gpio=0;
  78.         #5;
  79.         gpio=1;
  80.         #2;
  81.         gpio=0;
  82.         #7;
  83.         gpio=1;
  84.         #6;
  85.         gpio=0;
  86.         #197;
  87.         gpio=1;
  88.         #5000;
  89.         $display("OK!");
  90.         $stop();
  91.         end
  92. endmodule

復制代碼

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
8 [報告]
發(fā)表于 2010-10-20 09:19 |只看該作者
lz 牛,這樣在實際工作中的體會很有實際意義,遠比一些紙上談兵有實際意義.
system888net 發(fā)表于 2010-10-20 09:01



    這不是牛不牛的問題,這是常識,可是初學者卻不一定有這樣的常識.

論壇徽章:
0
9 [報告]
發(fā)表于 2010-10-20 10:44 |只看該作者
這不是牛不牛的問題,這是常識,可是初學者卻不一定有這樣的常識.
cjaizss 發(fā)表于 2010-10-20 09:19



    問題解決的方法沒有掌握之前就是實際問題,掌握之后就是常識了,在解決問題的過程所花的代價(時間,金錢)等就構成了解決問題的成本,能有效地解決問題的方法就是好方法,至于這個方法是高深的還是屬于常識的,這屬于各個人的主觀評價了,但不論大家如何評價,不能否認的是解決了實際問題的這個客觀結(jié)果.
   
   因此善于解決問題的人和能有效解決問題的方法就是牛!

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
10 [報告]
發(fā)表于 2010-10-21 12:29 |只看該作者
對于其原因,我的電腦截圖不知為什么出了問題,所以無法截圖了.有興趣的用modelsim仿真一下以下的電路,仔細對 ...
cjaizss 發(fā)表于 2010-10-20 09:18



    解決這個問題似乎就有點麻煩了,這是信號干擾很大的情況了。
  但方法還是一樣存在:我們只辨別緩存為全1的時候認定為高電平,全0認定低電平。

  1.   `timescale 1ns/1ps

  2. module reset_module_test(

  3.                                 gpio,

  4.                                 clk,

  5.                                 rst,

  6.                                 io_out

  7.     );

  8. input gpio,clk,rst;

  9. output io_out;



  10. parameter REG_WILDTH=6;

  11. reg io_out;

  12. reg [REG_WILDTH-1:0]gpio_reg;

  13. wire negedge_gpio, posedge_gpio;
  14. always@(posedge rst or posedge clk)
  15.      if(rst)
  16.              io_out <= 1'b0;
  17.      else if(&gpio_reg)
  18.              io_out <= 1'b1;
  19.      else if(!(|gpio_reg))
  20.              io_out <= 1'b0;
  21. endmodule
  22.    
復制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP