Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~" A' W0 H2 o; ?& f& \" n
我有9筆資料 同時輸入 A1~A9
8 P3 R1 y0 P3 u& q/ x要如何設計才能達到按照數值大小排序輸出X1~X9/ I  m& ]) M7 L/ L
有辦法達到real time輸出嗎?9 r# K1 Y3 q& s, I/ J' W
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.. j2 W' u, u/ o- i; E& t3 D: p
- D& O& Y  w1 l2 k" q& C
假設有九個registers,每個register附帶1個comparator,
3 e1 m& M8 v: {( A6 s. W每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n) n! P7 i6 V) w* H
if (Reg(n) > Input_value)
" E! K, ^5 c+ S  r/ E4 K" F
- d% t( e+ I3 j- |9 r- a       Reg(n) <= Reg(n);                   //保持原來的值# x* D& m+ v# J$ l
5 C) G( \& L; j' M4 \/ h% n0 e
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
7 ^0 K/ p. G4 X$ B2 t, `
' h# ^+ _7 ~8 R& ?6 [( U. C       Reg(n)  <= Reg(n-1);             //shift in 前一級的值, z" L! ]& I! L  ~1 Q. q

: ]" F) O2 B3 ]else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))+ }* Z! s; l" E5 R
     
& [% r' Y! ~; r& q      Reg(n)  <=In_value;             //load input value; P7 h( H& h+ v& C1 k
         . N: q% W0 R. M7 c5 g8 l
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~/ ~7 U0 B/ a: W! ~& P5 }* ^
. d) l$ c9 g6 Q" t4 i
至於你real time輸出~不太懂你要表達意思~( w, ?( x! q" h/ n
* k- F/ S/ Y* y0 X; [
你可以把你整個架構描述完整點9 m: S3 t* {% z& k

1 Y/ ]; ~4 w4 i; w! P* u這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut % f/ p/ q0 X8 t; u0 |' K0 _

1 s7 u) d+ L" O: e( j( U4 d$ @8 v: [. E' @1 l* N$ {# g: E6 M
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
. `& ~' y1 h3 M2 v   所以要將畫面中9個數值做排序後輸出中間的數值5 N5 K2 W1 S4 b, c; m( o
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成; a( n2 u2 n1 b6 `& r4 h
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法* I( l: x/ o+ {" C3 d+ {
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案. X3 r# m. w7 H
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
$ _+ E5 n2 k7 I" L  `4 H
9 {. H# ~9 o* y/ o- J& Y6 G舉個4進4出的例子:
5 P1 m  f1 G- C5 |2 _input [word length] a[4];) h& u- }, {% Q& A& K1 D/ S
reg [word length] b[4], c[4];; ?+ c# [$ l) _0 n
第一次排序
% L; T" t0 s" `" E8 j# Fb[0]=min(a[0], a[1]);' q4 A: L' f! M6 D( j* C5 v2 m8 ~! v
b[1]=max(a[0], a[1]);. V) I  x# D0 N
b[2]=min(a[2], a[3]);. _! M4 D5 `" ~7 F& ~
b[3]=max(a[2], a[3]);3 G+ R4 a4 {( v- S' H. d
第二次排序
3 L+ D8 ~9 M& A" @0 U" |! bc[0]=min(b[0], b[2]); //real minmum5 i2 k7 v! a7 i% J7 r8 x# H
c[1]=max(b[0], b[2]);
: d0 y) f$ H/ ]& U9 Bc[2]=min(b[1], b[3]);5 t8 E7 `" B' K: t
c[3]=max(b[1], b[3]);//real maximum
* m) h! \* ~/ W2 Y) H1 B+ [4 ^第三次修正項
( ^- I( Q" K0 `5 p/ ?+ X3 l6 sd[0]=c[0]; //real minmum7 m  \/ X, r4 R4 l9 e+ K
d[1]=min(c[1], c[2]);
1 X" W7 ~5 k, b! a, bd[2]=max(c[1], c[2]);; A9 ?9 m+ q5 H, e% G
d[3]=c[3];//real maximum
1 w8 d, q* m' D3 Z' g; {+ X1 i//d[0]~d[3]就是依序小到大的答案
/ w6 E. B% @( R/ D0 S6 B3 e) V/ P( j  n3 S, I
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)) x1 W% k  d- Y
+ ~& M$ X( c# U+ J( b
實做的考量) a# ^: m3 I2 S* a: {& b; `3 k
1. 實做上min()跟max()應該是一起做的
% D3 |4 B$ S" i0 h- } if(a>b)
( l$ \+ T' s+ s, w     min = b;
7 x/ k2 G/ X( ^7 V9 h2 |     max = a;
) }% P( B: R4 T' {! g  else  O+ T: }' M" t0 X
    min = a;
6 N! }& x  w: Z    max = b;
& ]2 I. X; j% L" C' Q0 h& F/ ]) }2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
2 a( y- E) L9 T3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項." T0 I1 g0 w: ]8 ]! Y- x
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 ) `+ }- R: T6 {$ I2 y1 k6 t% S

( Y, c+ ?' y0 T# i: x: T回復 5# tommywgt
" b+ ^1 R+ i3 l1 ~- B9 k, N) J
' J1 L, |: h7 X- L  _; Y9 G' }6 @: |7 `5 f9 Y* K: {* |) M
    謝謝大大熱心分享1 [" @4 p# G& o* U( R8 J2 Y
我目前的做法是這樣的,提出來給大家研究討論一下.....
5 [7 _: ?5 m9 s0 }& \" x我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 44 c7 ?2 C4 i4 X* U2 N
則想像成
7 r) n/ n7 r! I. R; r4 S5 9 6
5 z& I6 S" b9 a. m; Y' n! F7 8 2
  _+ {! L% ?" e" @+ B1 3 49 ?( M0 K1 P* \& \. R6 q! j/ t/ X3 R
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R/ W: A$ ~& |5 {" Q
將3段數值分別丟入R 得到
- @6 M7 |+ T2 X* C  J' Y* i5 6 91 p3 ]6 O: L  w, t! O
2 7 8
; |4 D. `. [2 H% B/ L1 3 4' e; i# V( h( k, X+ K6 e
這時候再將 垂直列的3筆丟入R可得到
% U5 v$ h! E8 O' h. {1 2 5- ~# N! l' B+ j& h/ \2 w, U3 l
3 6 7
  a0 Q9 n# k" U7 A& Z' k8 }& t7 o: N4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
4 B2 D! u2 v! N& m. R# j0 W; a! e# v- u' ~
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
& q/ I. {' u' d) ]  P& t1 2 4
! [- _  k8 ^# V! Q, a3 5 7
5 q' _1 j+ H- B1 F6 8 9- z% y% p$ q2 P) z
這時候可以發現/ ^8 S3 U' p8 n2 o7 O  l
中間的數值確實是9筆資料按大小排列後的中值(5)% k$ N/ K! i, U' ?$ Z( ]
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
5 a" k9 M! x3 B其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了+ A% f$ ~" c6 r, Y/ N0 C
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算2 L# t7 B9 X$ F+ k5 S2 g( s1 d
當亂度能包含所有的項時, 答案一定是對的' G  d/ T4 m& [* o# o
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
) O- j1 @6 i5 N; r5 F# z, O左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算, d% q* a8 y8 V, o
所以在最大的亂度中, 8-1=7次應是最多的運算了, 3 Y4 X+ p4 a1 `9 g( Y5 r
& {4 C# ?3 D  T7 w: U2 o
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin
; M0 n0 \' S. L; ?/ p# M( Y) w& I2 T/ _" p5 E0 P: B
7 j4 m! y; U' e4 V
    大大的方法真不錯~ 我怎麼沒有想到呢XD....
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter
* s  w4 i$ d5 u: k' F3 v22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-9 10:48 AM , Processed in 0.155520 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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