Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
5 F1 p. B' E" ^2 u% G我有9筆資料 同時輸入 A1~A9
+ z* Z2 u, g6 P5 q* U3 c" D! m1 e! C要如何設計才能達到按照數值大小排序輸出X1~X99 @( K- T$ ~/ T0 H$ U! I' Y
有辦法達到real time輸出嗎?) g5 C8 ~, j4 b6 I5 K; W
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
9 G" p5 n1 t- v! a7 ?* Y' d. B- y7 U9 R' @, i
假設有九個registers,每個register附帶1個comparator,
, q$ q  C0 B+ Z/ c& C, S  g5 O8 u  a每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n& H3 F# x/ c" O9 @  Z" X1 r! S
if (Reg(n) > Input_value) ' r* Y4 R4 E) j* Q8 }5 V# _
: s2 f" h7 }% h9 [6 ?/ o- g+ `
       Reg(n) <= Reg(n);                   //保持原來的值
0 Q1 W5 P! O, D( q/ O* ~
" S3 ~2 C/ }( r! p+ g3 N& xelse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
* n- t  |6 a; F, g5 `) g
$ l  o0 C& P8 S2 j- t5 v       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
' ]% s( n' x% L9 H, n; b# s! V% ]& V
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))/ {5 @% Z- h+ M
     
1 w# J0 P3 S# x& J0 f  G3 v      Reg(n)  <=In_value;             //load input value2 D1 P) P6 l* ]! A4 c
         
, ?4 o; I: ^( w/ e7 ~6 X& G7 h: m9 h  M每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~/ C6 z. i$ z4 Y5 n5 Q- `

% s' O2 E/ F( D1 J至於你real time輸出~不太懂你要表達意思~0 X/ J! k" i2 z2 e! D# H8 G
; F1 y* U% s1 M! N
你可以把你整個架構描述完整點
9 d3 R' G2 h! s* I* n" f2 _1 H2 J9 K
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
4 Y0 g: v+ ?) F, _, R: D% ~% U; B6 a& Y) S6 E' F3 X/ }  ^- y
6 a6 S: s$ b' F. ]' x% k
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
3 G0 v8 ]5 y9 f  j! K! b: a9 M- }   所以要將畫面中9個數值做排序後輸出中間的數值9 s- H8 t7 W* \' U3 d
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成/ d% q2 v+ g3 P9 O: Y9 e  m
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法% V1 D8 a9 }/ \; I
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案& p7 c( I" c/ Z
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
% w# S# B& U% m% t5 b2 W8 H5 U/ N
; k) @$ p: e1 n) `" s舉個4進4出的例子:
: d1 B, I) t$ O; j  A9 ^input [word length] a[4];" z% L" H! k+ ]5 E: l0 B2 |9 k9 N8 s$ g
reg [word length] b[4], c[4];* J, ?/ ?; ~  z5 [: w! E
第一次排序
' g& c% B$ v" ?) }& w1 Q6 A- k; Ob[0]=min(a[0], a[1]);
0 `5 ?  [# k" z. @b[1]=max(a[0], a[1]);  w% x% @( M: G" I
b[2]=min(a[2], a[3]);/ r+ r( e% k) O& [; c7 K9 f
b[3]=max(a[2], a[3]);" e! \" ]( T# m" l& x8 T7 ]7 x
第二次排序# e4 c% @5 ?5 L* @2 J+ M
c[0]=min(b[0], b[2]); //real minmum3 ]' M  l4 E; |$ I7 _& l
c[1]=max(b[0], b[2]);- c. ?1 r: H) x( F; g7 f
c[2]=min(b[1], b[3]);
6 C* t5 g; T: ~$ R' ec[3]=max(b[1], b[3]);//real maximum
7 j( A' Q  `9 o# p3 c5 F7 e. |; n第三次修正項" a: S# X0 b2 R9 {3 i" i
d[0]=c[0]; //real minmum( z8 f4 I) S+ ]9 w3 u' ~6 s9 J- b& X
d[1]=min(c[1], c[2]);
  {, g/ p. C7 X' o5 dd[2]=max(c[1], c[2]);6 C" u) ~1 d) M) W  C
d[3]=c[3];//real maximum& L: B3 C& j$ S$ ^$ s
//d[0]~d[3]就是依序小到大的答案
# ]9 T9 C; P, Z
; q  V3 Z! R0 w* ?& S' O這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
# I+ Q5 N) y/ U; c- j# J
' e2 |6 E; [. _) j, u$ O實做的考量6 s4 t0 T- o8 i7 E
1. 實做上min()跟max()應該是一起做的5 Z; q7 |2 F' N  @, |) ^
if(a>b)
" v' v1 S! j4 {! G     min = b;
* c" f' V% i6 I! K6 P% s: o     max = a;
. ?, O! N0 ^7 d8 ], S; O  else
! U: O1 b8 B! E' w$ `    min = a;
" H) [. N: K: X    max = b;7 {6 E" p+ n5 L9 h# G* e9 B5 ~0 Q! Q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.$ F- ]' G+ ~, \$ T# n  v" d' x
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
( x! d5 B) X- Y9 V  l! z, `+ s& vP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 ) d9 F& G( J( n  v7 I# |' Z8 Z) y

  @# }+ E) F# G2 E0 P- [回復 5# tommywgt
: Y2 p7 P6 Z% ~' Z. R9 F
2 C* K9 F' @6 E& n
6 G$ _( r: K) B' t/ g    謝謝大大熱心分享7 ^0 b" X. ]$ C' e
我目前的做法是這樣的,提出來給大家研究討論一下....." I/ i# F( e& I  b0 L
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 42 t1 N3 ~0 v9 {3 q
則想像成
( k0 S! ~! l: [3 v+ j5 9 6
8 O& Z/ ?4 M5 G3 G! D. M. ^7 8 2* n' i+ R) F' n; `
1 3 4! ?+ {- n! c8 }) {! {- d4 F8 ~5 M
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R8 V; B3 j+ H; U7 u2 t8 A
將3段數值分別丟入R 得到 8 H! U, a2 Y; V# S6 k9 c1 I7 c
5 6 9  s' w+ q; S0 W, N2 L8 ^
2 7 8
- ]; q) Q9 @& {) k& s1 M1 3 4' S9 x4 H+ ^9 `. _2 [  d9 y
這時候再將 垂直列的3筆丟入R可得到
. X: m7 V( X5 ?4 G* m6 Y+ [1 2 5
6 n1 _' i  f: ]* t; C8 W: {; Y1 e3 6 7
& D  K* E( t6 [+ Q( k( [4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@). n7 ], t+ k2 R/ d% N: q1 K# U
6 u! Z+ m& T. D, @, R, V
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
1 [8 F3 m$ t8 z" i% w/ n5 X1 2 4
" f' C. {  g5 v6 L1 k3 5 7. [3 H5 M+ ~5 B6 o
6 8 90 C) j4 N1 ?, `' J8 P% T4 t
這時候可以發現+ ]' G; m8 S& V* J1 A
中間的數值確實是9筆資料按大小排列後的中值(5)1 a% p8 A! F8 J; L
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
0 E9 D) u$ t1 o& _9 p$ o5 F& f其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了! h+ Q' \: R& U$ n5 A
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
) @7 S7 I$ |, p當亂度能包含所有的項時, 答案一定是對的
8 U/ q+ ~! P; A1 c) K所以關鍵就在於如何用最少的運算次數達到最大的亂度.
2 }8 Z/ H7 Q/ P0 ?0 I' F6 k左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
0 D3 H, g- j+ y# l所以在最大的亂度中, 8-1=7次應是最多的運算了,
3 i! p; E. A$ @- @: [
3 k& q. b# X& v- ^; J有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin 9 R2 f: w2 {$ w0 U! C
. s: X8 u$ W* e. ^( C2 U% ~3 e8 ~% ]
  ~( u' {# \6 U% ?5 v1 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
- g4 j( Y2 I6 a" m% V+ p  `22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-22 01:56 AM , Processed in 0.122516 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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