Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~! L% I7 j  L3 ]
我有9筆資料 同時輸入 A1~A9
# n" M1 N- X1 e& B, b' E3 j  ]要如何設計才能達到按照數值大小排序輸出X1~X9; Y& o% z& {9 @4 c) o# Y
有辦法達到real time輸出嗎?" j  E0 K; N2 }! F4 _0 {
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
5 q+ c6 ]0 `& q" x7 r3 L( q# ~+ s9 ~
假設有九個registers,每個register附帶1個comparator,
2 l# i6 l% Z. e: _3 b) p每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n6 u, O) Z7 O8 k
if (Reg(n) > Input_value) / e+ W! |  p' L2 K/ y6 p

) V* @, x4 q' B8 Y% W% R8 Q       Reg(n) <= Reg(n);                   //保持原來的值
4 P% e& e, L3 B" p, o2 n- y+ e& Y0 J/ ]' e( ~
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))2 K" k) W* C) D, v; K) k! C
* |6 Q& L! G6 ^2 f, _5 _
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值+ X$ Q: x) m  C4 h* ?

4 }% _+ W/ }* a1 {else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
! ]1 V9 u" U! a3 i; i2 z     
0 j# M. m, J6 }: w( f3 `: c' s      Reg(n)  <=In_value;             //load input value/ N5 d) }+ |9 L/ B7 ^: N
         2 @+ c5 o- M: x- P
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
  c0 v' v7 c+ P0 i2 i  I' ~3 \/ n9 y
至於你real time輸出~不太懂你要表達意思~
+ D( ~; f+ N% y: T% P  P# |8 p  F/ D$ V- Z( F
你可以把你整個架構描述完整點3 i: I( R9 d2 U' K; W

' o. k9 n; Q8 t& G5 S這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut ) M" {; n& I7 g& P- _7 k) i5 A7 X% A" I

6 t. `! m7 O: e/ _7 V2 \* \
* Y) k4 j7 Q0 B# f/ U+ a    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
6 G1 _1 M8 z% a. H. {, s0 v   所以要將畫面中9個數值做排序後輸出中間的數值- ~' {1 m1 j7 P+ ~! H% P, e
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成* \0 a& J) A" z
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法  t5 ^& v9 Z. {5 N! {0 l
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案& K- b1 h! ]: \
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了., u% }. z: b- S$ Y

( o) t: W" f$ q7 r- m1 N" D舉個4進4出的例子:7 I: L4 P5 I) v( r- D0 i
input [word length] a[4];
& }- P7 `: B- `% D9 ureg [word length] b[4], c[4];
. B2 u& T* E/ H8 ], i1 D第一次排序8 v0 v/ l5 g/ ]7 ?8 {
b[0]=min(a[0], a[1]);
9 C& N% d; f  j' C4 q' N* ub[1]=max(a[0], a[1]);
* \5 F) t* d# X+ ]1 Hb[2]=min(a[2], a[3]);
' i+ O2 O; P( V- lb[3]=max(a[2], a[3]);
" W' {: ~4 x: Q8 ]/ s$ A  L8 x6 o第二次排序
, P8 u- f, r/ w. @c[0]=min(b[0], b[2]); //real minmum
$ N6 {" B9 A8 x) T% \c[1]=max(b[0], b[2]);
! r( K" O# Q4 b, c' |- m/ [6 X+ mc[2]=min(b[1], b[3]);& y3 {7 o2 T- Z8 A* U
c[3]=max(b[1], b[3]);//real maximum, n4 y! |; ~5 G0 ^9 V* a
第三次修正項
0 r8 }) ^% m7 B' r2 ?d[0]=c[0]; //real minmum
/ V5 f! X7 x& l7 }. J! bd[1]=min(c[1], c[2]);
3 O9 T' F; X6 U6 o' R( {d[2]=max(c[1], c[2]);( d( M" c9 A4 O& Y
d[3]=c[3];//real maximum
+ @% G3 Y' q+ q3 \. }$ C- x  P* N//d[0]~d[3]就是依序小到大的答案
; I9 i2 v- x1 i
1 M1 {% m+ F9 F/ S7 ^8 z) _這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要); }4 T# S  a1 {  u$ h- c7 z

5 M3 U3 L# p) }: t' t實做的考量) z* m! A4 P- _' F% c8 |- i
1. 實做上min()跟max()應該是一起做的
/ z# {* q8 s) B* W if(a>b)5 D. X: |7 k) i: U+ ]
     min = b;
! b5 w9 C! ]& p! ^; m: u6 `! W     max = a;2 C$ \  y  B# {) r2 u5 P+ |  m' j
  else! t6 ^+ @2 H, W  O# i7 G
    min = a;5 I4 O5 B; f$ r) W2 W0 ^3 C
    max = b;) q2 T+ q5 c* b/ N, I/ ^
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.3 r0 W, x; {6 F! ]
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.7 V- n& t* c, M; u# T- c
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
- d' }. P' j; ~5 H7 ]7 ^
0 t# f3 z- T4 f回復 5# tommywgt
: o6 U: W* `% Q1 B" }' a  E% L1 S. O2 u

: c5 F' W: I% \6 L" D" D* X    謝謝大大熱心分享  M: Q: `4 {7 m2 J  b
我目前的做法是這樣的,提出來給大家研究討論一下.....
3 s- H6 R9 J  b2 _我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4  g. K2 M* V+ K! V8 l
則想像成
1 S# U+ o; C+ |# B' \4 ~5 9 6; R1 Y  M; P" U% M6 C
7 8 2
/ G7 z4 t' C* f2 X- `1 3 4' }, n; g! ~1 {1 h, G+ y
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R
+ B' i& a5 z' q2 y8 y將3段數值分別丟入R 得到
2 x' K) K9 n/ y  k  T+ J% |7 C5 6 9& R( q4 A* l  X; p! \, n
2 7 8
' O, t. f; F  x2 J: }3 ?1 3 42 B  v9 N% S- c. h& n' G
這時候再將 垂直列的3筆丟入R可得到! o  e% d1 W' N2 D5 J( H
1 2 5
4 z6 u0 W5 L0 v: r" u3 6 7& v, O4 y/ Q: U7 r/ @5 H/ }1 g: l
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)% c: ^) Q  m0 u% p& U
# H! t5 `' Q$ k$ r2 u
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到! k+ }0 {( X2 R4 b3 S: e/ _, V
1 2 4) [6 n9 q0 H# T
3 5 7
9 d+ C8 q5 z* w* d8 W6 8 9
  J8 d1 F- g* I5 T這時候可以發現7 {: r7 b- o8 d# n9 B
中間的數值確實是9筆資料按大小排列後的中值(5)
6 O  y/ q  V2 f6 ]# p, e雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪' Y5 {" X) ?6 A3 a' i. t3 y
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
: S4 Z1 s; B' q. s; k6 c最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算4 I3 Z6 a. R6 X- q. i# C% |
當亂度能包含所有的項時, 答案一定是對的4 z  n& n9 x7 ?
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
- X* G: O: @- y8 G2 M& F, D左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算# O5 D4 q' \  |7 T* k7 }5 n
所以在最大的亂度中, 8-1=7次應是最多的運算了, 7 |0 v4 S7 e# s% o

3 i+ E, `* A: ^' Q: v9 K有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin 7 ]7 }+ M# H, ?: Z

& i- C9 G& m  S# x3 w( Z9 J, d# V: n* U' O
    大大的方法真不錯~ 我怎麼沒有想到呢XD....
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter8 e& g. \6 G, J/ r; o# F4 n
22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-20 05:40 PM , Processed in 0.123516 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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