2010年10月27日水曜日

BIN2BCD

ブログFPGAの部屋の今日の記事は2進数からBCDへの変換回路だった。
おもしろそうなので、私も検討してみた。
私の場合はこうするかな?

module bin2bcd (clk, bin, bcd);
input           clk;
input   [ 9:0]  bin;
output  [15:0]  bcd;

wire    [13:0]  k3; 
reg     [13:0]  k3b;
reg     [ 3:0]  d32;
reg     [ 3:0]  d31;
reg     [ 3:0]  d30;
wire    [13:0]  k2; 
reg     [13:0]  k2b;
reg     [ 3:0]  d21;
reg     [ 3:0]  d20;
wire    [13:0]  k1; 
reg     [ 3:0]  d10;
reg     [ 3:0]  d00;

assign  k3 = bin + bin[9:6] + bin[9:7] + bin[9] + 1'b1;
always @(posedge clk) d32 <= k3[13:10];
always @(posedge clk) k3b <= bin - (k3[13:10] * 1000);

assign  k2 = k3b * 10 + k3b[13:2];
always @(posedge clk) d21 <= k2[13:10];
always @(posedge clk) k2b <= k3b - (k2[13:10] * 100);
always @(posedge clk) d31 <= d32;

assign  k1 = k2b * 102 + k2b[13:1];
always @(posedge clk) d00 <= k2b - (k1[13:10] * 10);
always @(posedge clk) d10 <= k1[13:10];
always @(posedge clk) d20 <= d21;
always @(posedge clk) d30 <= d31;

assign  bcd = {d30,d20,d10,d00};
endmodule

パイプライン式でLatencyは3だけど乗算部が5つもある。
y = -ax+b , y = a x+b部を1つにしてステートマシンで回すようにすればもう少しコンパクトにできるかも知れないな。

0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...