Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 24826|回復: 11
打印 上一主題 下一主題

[問題求助] 請問~Verilog 設計資料排序~

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~. N" _: W9 r) S( t- U
我有9筆資料 同時輸入 A1~A94 S1 S( {! M  z& M) Y4 E3 n* [& W
要如何設計才能達到按照數值大小排序輸出X1~X9) V6 w- q4 V/ C7 F7 {
有辦法達到real time輸出嗎?
$ C/ E; Z. `# I4 X3 ~還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
" n9 ~/ g  l, J7 ?, x' t% T# }
2 B2 ^$ ]' E5 o* J, K& b+ r2 `* H5 g假設有九個registers,每個register附帶1個comparator,
6 i+ x3 u* H2 A8 B* w每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
% k* m# M' L. J5 ^* A. d9 {$ `- C/ Lif (Reg(n) > Input_value)
- a% u/ `. D  @* j. a
/ P8 K, P: J* @- [       Reg(n) <= Reg(n);                   //保持原來的值1 |$ c- e  X2 r: ~, V

2 \$ C7 k9 ?  P9 Aelse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
3 o, ^2 a0 v& u
9 Z' d' k  Q$ q+ r       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
/ Q! C5 k) k& x8 y' q* R1 s; R
! a8 ?! o1 M* d0 f" V% H, ]1 {else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
; t$ \# J4 ?  J6 h+ N1 ^8 D     ( \& b8 \& c% P  O$ a& V: f" I
      Reg(n)  <=In_value;             //load input value
7 a; ?& \# ?+ G+ f9 ?7 Y         
7 k( Q, C) R2 E' N8 r每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
% ^& @5 [. u( Y+ Q$ S& b3 l
; o( }6 u. D* M5 ^至於你real time輸出~不太懂你要表達意思~
! r. Z* h; c* m* B/ _. p  I8 D2 d$ l; T% r
你可以把你整個架構描述完整點6 V( s8 Q( e2 B5 ~

: k6 m% v3 Y) O' {8 b$ w這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut + p1 A  R; Q) j' l& G! c
$ {  ]* e# T+ Q  o! d3 T

2 u! p3 ~; x% W" u9 E# W    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 3 h6 o6 U( T/ K1 u& `
   所以要將畫面中9個數值做排序後輸出中間的數值8 ?+ X7 e' z/ T$ R" t: Z  h" R
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成9 f" [( W  [4 ^2 O! N8 U! i/ A
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法1 d1 [% }8 t7 x* D
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
+ R: Y4 Q- L! K- Q3 H% }至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
( T8 Z7 u& U( ]- ?2 ?
; p4 G6 t/ X) e' @8 F! G2 a舉個4進4出的例子:/ c+ _; c& Z+ A3 I" [' G
input [word length] a[4];/ k* Y/ }5 c+ f) R7 w/ }' \- O1 L6 B
reg [word length] b[4], c[4];
( H4 G' s$ E7 q2 J: a1 M( J: |7 D4 }第一次排序6 Y- Z, U8 x, [4 A# {
b[0]=min(a[0], a[1]);5 d! \) v, o( h, `0 u) v
b[1]=max(a[0], a[1]);
7 k& M! L6 N+ M7 _" O7 t1 `b[2]=min(a[2], a[3]);  M# {3 B/ Z4 h+ ?+ K) A/ p
b[3]=max(a[2], a[3]);
/ j7 E, \. `/ L- Z, x8 Y第二次排序9 k0 s" o1 u( K' H( s1 y
c[0]=min(b[0], b[2]); //real minmum: Y" p1 H1 ?3 ]9 e5 Z5 F
c[1]=max(b[0], b[2]);: t% m! R- z( Y
c[2]=min(b[1], b[3]);
7 u! t  b- `% K7 O% S9 uc[3]=max(b[1], b[3]);//real maximum
. ~6 x" Z" N0 D7 D7 o第三次修正項* {2 G" E. Y& o0 {) `( ?- A7 N
d[0]=c[0]; //real minmum
5 l: u& G3 X+ U, N6 Z$ m* od[1]=min(c[1], c[2]);
; H" }9 O, `# x) x7 ~0 I4 kd[2]=max(c[1], c[2]);
+ `" j6 [9 l0 Y- Vd[3]=c[3];//real maximum
8 E% N$ G) \  ~3 S( U* N//d[0]~d[3]就是依序小到大的答案7 i; C5 f' c# S- t$ M
2 `, K* @* w& D( ~$ g% }" E
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 I3 D2 Y: K) N: a& K
7 u1 H& R. {) G: {# l- v
實做的考量
( F! j; U# }1 S- }9 u3 n7 u: L1. 實做上min()跟max()應該是一起做的
6 S  i9 X, ?; A6 Y3 l3 B if(a>b)
) w$ W* x* ]0 Z+ R     min = b;/ u# T- ?6 E& p% _. l
     max = a;( N3 B% l5 l( b  s
  else6 O. a( {+ X. d7 n" ?
    min = a;# t& N0 K( l1 f& ^' {7 `
    max = b;9 W+ \3 I% L2 \5 _+ n& A
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
8 f/ ^8 R/ F& Y  v1 B3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
7 d" u1 T8 z1 O: X) }- [P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
6 i5 {$ e/ O+ [4 I
( C+ x9 f, ?& X9 h" l  {回復 5# tommywgt
" @( M6 F" u, c! F4 t5 E
2 w$ p) B% v9 g- ?- D) ?  _# ?9 k
    謝謝大大熱心分享
7 i0 _6 l1 j2 \; O8 l我目前的做法是這樣的,提出來給大家研究討論一下.....4 L2 c& B. L4 m9 Q6 T' @0 _
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
# C* Z5 w+ \6 I則想像成 6 E4 L: \  M1 S7 {( U
5 9 6
" _& r0 L( {8 Y; @4 [7 8 2
5 \' v" _* W' m0 _7 n1 3 4
* A1 f* I5 x+ r& v不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R, x' ?* i$ Q- Z  ?/ v
將3段數值分別丟入R 得到
5 l4 `( Z4 C' P" Z% k- @5 6 9
+ N( k6 {2 P# n. U+ p9 b' y2 7 8
7 z/ y- _, l; d. ~, _1 3 4
: @3 P4 o* T3 q這時候再將 垂直列的3筆丟入R可得到
! P" _1 K7 U+ n; I! W4 V1 t, d0 f1 2 5
6 I, c  P: E9 m, \. U# O3 6 72 h" z5 _4 a/ I3 M
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)! U5 }( m# f; ^$ f' c3 a
2 e3 v* E6 b8 C# `& |  B
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到( t8 ?8 X- i8 I3 K+ A  h0 Q
1 2 4! @! V7 P9 A$ w' o. g9 O1 ]
3 5 7! z6 w' `: l$ \* c  w$ e) @  j
6 8 95 v  @& Y8 t. M3 Q# ~0 k8 Z1 }& ^- ^
這時候可以發現
. l& S5 r! t! P5 K4 q2 ?中間的數值確實是9筆資料按大小排列後的中值(5)
9 e6 b2 _4 E: G  ?# i9 c雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪# ^! }! ]7 l2 l, }
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
/ `1 q% }( r- o7 b" {最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算: |% T+ P0 N  ~; b0 W7 j
當亂度能包含所有的項時, 答案一定是對的
& Z8 D) ~7 L' l9 V2 G. F2 P所以關鍵就在於如何用最少的運算次數達到最大的亂度.
# @+ w: d: ~8 r2 V: ?, I左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
  D* J: l/ ?% b: x5 h9 y) y所以在最大的亂度中, 8-1=7次應是最多的運算了, ( t7 p0 R6 Z# i; @* y* ~; v
3 z5 Q" z* }8 ], `% B0 s* M+ V
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin
3 X* u2 ~8 @) {" E3 I* y* k) M
+ \1 D+ x0 }4 |+ u, V$ X
  d( ^% s9 C, }( Z4 p' E    大大的方法真不錯~ 我怎麼沒有想到呢XD....
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter9 p8 H/ t) a7 o* H. Z
22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-15 01:32 PM , Processed in 0.122515 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表