Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
* k- X, [, S5 g1 [我有9筆資料 同時輸入 A1~A94 f+ j* E" K: N. z. L- l
要如何設計才能達到按照數值大小排序輸出X1~X9
8 P" r. a4 P" {有辦法達到real time輸出嗎?
% P7 B# y2 r* D還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
! X7 w% ~  K$ @2 s3 R5 S7 w- z' W
" s1 z" D% z4 w- d7 j1 H假設有九個registers,每個register附帶1個comparator,/ F5 z6 |% c# o8 D
每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n2 Z+ r$ s/ }5 m/ w4 }, T4 E- \0 v5 A( \+ i
if (Reg(n) > Input_value) + Q! n" b- A" X# N3 k

4 t5 q; w( W, y! w. r% B: T       Reg(n) <= Reg(n);                   //保持原來的值1 {0 h- @; A5 i* j! L$ A
4 K: w# v( Z1 \! k8 B
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))$ i: Z$ r+ q2 t  O* T) y

+ I8 x" s2 E1 ?) N3 {       Reg(n)  <= Reg(n-1);             //shift in 前一級的值- B6 _. m2 J9 n3 B  m5 E8 H% ~
- s& }1 l$ l; \  K
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))6 o( p  O6 x) w( E' \1 V) P2 R
     
5 }6 o' s# |& s4 }3 Z      Reg(n)  <=In_value;             //load input value! k5 `7 K- V0 }2 S
         
4 o3 k) z. r& P. q2 Y" U1 V3 g- L每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~9 ]2 a9 C# D, y

  w" t- y8 K9 O. P4 g+ k& C8 c( H! L至於你real time輸出~不太懂你要表達意思~' n8 O+ R4 z4 |; H' j& f7 x# L" R6 P4 s
% {% u4 ]& f! t  ^) p
你可以把你整個架構描述完整點
% Z1 `7 [' \# ?5 e) s4 W% W0 P" D: c  [  x1 R2 @
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
* t: E  b3 E2 ?2 j2 r; }. [) N  L6 j3 i9 }) a; U5 ~) C

* |  g' ]% W1 q+ A# V% `* p3 X    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 % b* v6 n2 {0 |# F: w
   所以要將畫面中9個數值做排序後輸出中間的數值
# J" u, h' ]+ k. D# L! O+ l5 `. W因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成5 e9 }5 j, |( E8 q# @7 W! m
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法, D- n( A+ ~  E: j  q! c# g
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
2 ^& O. x  t1 j1 x至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.0 K& V. Q" ^! U, t( z
- |. E" f% t+ h; ?! z$ C5 ?& L% h3 y
舉個4進4出的例子:
4 S  n+ Z! w4 Y# Rinput [word length] a[4];& {( U) _1 M6 ]4 P: J
reg [word length] b[4], c[4];
  w. o* t! R  n# W1 x第一次排序  [. ]2 H4 g0 n' h
b[0]=min(a[0], a[1]);, b7 X& I" @6 v% Q: J, Z
b[1]=max(a[0], a[1]);6 J. Q/ l3 A8 Q  f& c9 C2 ]
b[2]=min(a[2], a[3]);% A+ ?& s+ Z8 u) O& d3 B6 c& w) h
b[3]=max(a[2], a[3]);' R9 B$ _- e# T) a
第二次排序. j  M* o# l4 x7 `
c[0]=min(b[0], b[2]); //real minmum( ~$ X  |  Y' o9 L% B" E
c[1]=max(b[0], b[2]);/ [3 f7 h- K7 t  ?
c[2]=min(b[1], b[3]);
/ D. t: M0 J/ I, j: Y" Sc[3]=max(b[1], b[3]);//real maximum# q" D; E- h* y) z
第三次修正項
/ o8 x9 ]: C8 R4 Z2 ~d[0]=c[0]; //real minmum
+ V0 K( {7 |+ X! f+ ~" d0 }d[1]=min(c[1], c[2]);
% \( |8 ?$ ]' \" b2 ]. f5 hd[2]=max(c[1], c[2]);4 a- s' z0 h2 y' S. C! o! |3 B
d[3]=c[3];//real maximum
/ Z* W* y/ I; q6 N( O  C' b, N//d[0]~d[3]就是依序小到大的答案
  Y0 \. ~2 V  w( H$ t7 T2 p$ [0 R7 T
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)3 t( z( a8 M; ~. P' K2 l' g

+ s) F. \/ E) T+ f實做的考量
! W0 m7 U" m: m1. 實做上min()跟max()應該是一起做的# }8 Q, O7 c; L; N( D( Q2 y9 {
if(a>b)& A3 A. t* e8 W
     min = b;4 d/ j. f3 T& a) m' y! y
     max = a;5 y7 ?! b+ v5 w* J2 a
  else* h, m8 b$ w; Q9 E+ Y
    min = a;
$ n6 @( @; a6 e    max = b;
  Y/ W" q/ T1 J2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.: p  r2 X1 _6 v  p+ M# ^  _
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
4 \! n- L! m- l$ }% [" |P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
4 i9 ~) A! W& f& A" ~8 l9 @7 o4 i9 w5 U! F
回復 5# tommywgt % \- h! I. P; [3 c, x
  r. G- |+ \. ]: j8 s

' A1 \4 F. k2 Y* x1 C  [; Q    謝謝大大熱心分享6 a9 E0 ^! M2 {3 ?3 N- s  H6 T
我目前的做法是這樣的,提出來給大家研究討論一下.....& i' q, v1 a, @) h, R
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
2 _  l+ }& C$ a- w% C. J則想像成
# W1 [3 E9 [# B5 @7 [/ q. t$ q/ W5 9 6: A: t" n6 ^, J5 S4 H% |/ m
7 8 29 Z. G4 D2 o+ T* R  z" I
1 3 4" R9 Z3 |5 v6 U7 H2 a  w
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R9 N' R7 b4 O* V- L
將3段數值分別丟入R 得到
" ^" b! q6 z* p! O* ^5 6 9; J7 W6 h1 `' ?
2 7 8
* E  Y+ }: u, U) ]1 3 4
% I: m& Z, Y) o/ {& c. |這時候再將 垂直列的3筆丟入R可得到4 T! n; |4 o7 @* G3 u! l( x1 R
1 2 5
( u0 L) B; R- M, ?& x& S  {, d3 6 7# z0 n- J: l% c: e: p
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
7 d3 z5 K1 c; ]/ j+ v& U0 r2 R  ?; ]% O  g7 Q( W1 j& s
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
  I  u7 |4 ]. l0 c/ @# n- y1 2 4/ \# v+ j' {+ `& B6 P1 s) [
3 5 7
0 O) g7 D# ]3 J  ~1 L0 `- d6 8 9
1 p+ }7 k, ^8 N  s# d9 `; Z這時候可以發現+ ]; n, O7 Y: N; f$ {
中間的數值確實是9筆資料按大小排列後的中值(5)
* ], ]" T# ?- C! B/ r8 `雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪: E( J1 W: k# u$ e
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了2 Q" Q* u# f& M$ f- o& ?
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算0 `1 y/ \( Q8 b5 z6 T, O3 w( B$ }; k
當亂度能包含所有的項時, 答案一定是對的
0 ~1 e. B/ S; V8 U) n+ `所以關鍵就在於如何用最少的運算次數達到最大的亂度.
2 u2 ?$ B% I& E' Y5 J1 K左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
" A# D% P" t' Q) r+ w; v1 _所以在最大的亂度中, 8-1=7次應是最多的運算了, ' G- ]) z7 o* w4 A8 `3 `0 E# A) s

! I0 D) [$ C% g9 q! T2 K* g$ }6 U有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin
6 s/ {+ T( j$ J- S$ O2 D
) u' D9 W: S4 B7 \' c& x! H" `& Z' N: m5 ]3 m, E1 H8 d' D
    大大的方法真不錯~ 我怎麼沒有想到呢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
3 w- ^0 a; u8 x7 `/ Z22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-1 11:24 PM , Processed in 0.140518 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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