インフラプロジェクト(10)BCD説明するためのバイナリスイッチプログラミング

EDITORIAL言葉

学習の前のセクションでは、我々はに2進数を変換するために習得した方法のBCDコード。だから今、私たちは、回路設計の種類、それはバイナリコードBCDそれに変換することができ、考えることを回しますか?

基本コンセプト

数学では、我々は以下のようなだけ進数知っている 5468を、以下のように計算を変換することができる:= 5×1000 5468 + 4 * 100 + 6 * 10 + 8、アルゴリズムに二進数を生成BCDようです。

ABCD = A×1000 + B * 100 + C * 10 + D

このアルゴリズムは、乗算器と加算器を使用する必要がある、ほとんどの従来は、この実装のリソースを消費するアルゴリズムで、次のように追加してシフトする必要があります。夢の翼兄弟アルゴリズムを紹介します完全なバイナリ機能にBCD、それによって、できるだけロジック・リソースを節約します。

シフトアルゴリズム原理

このアルゴリズムを説明する前に、弟の問題を説明するための夢第1のウィング:左バイナリコードは、バイナリコードの左側に等しくない、* 2たとえば、バイナリコード101001、41 10進数に等しく、左1010010ビットは、82進数に等しい得ます。

そのバイナリコードは左、そして、私たちはここでは、回路入力を設計する必要がありますか?代わりに、乗算のシフトを活用することができれば10を乗じたバイナリコードに相当することができる3つを残しプラス3バイナリコードにBCDビットコード、バイナリBCDコードの回転機能。

トップレベルのブロック図

 

トップレベルのモジュールのポートの説明

ポート名

ポート説明

CLK

50MHzのシステム・クロック入力

RST_N

低システムリセット

BW

BCDコード百個の入力

シヴァ

BCD入力コード10

重量

BCDコードビットが入力されます

バイナリ

変換された2進数を出力します

コードの実装

/ ************************************************* ***          

 *エンジニア:ドリーム・ブラザーウイング

 * QQ:761664056

 *モジュールの機能:BCDバイナリコードスイッチモジュール*************************************** ************** /

01   モジュール  bcd_to_bin

CLK 02    //システムクロック50MHzの

RST_N 03  //低リセットシステム

BW 04    百のの//入力BCDコード

Shiw 05は   // 10桁のBCDコードを入力してください

GEW 06    ビット//入力BCDコード   

07進//バイナリ出力

08               );

09                  

10   入力  CLK

11   入力  RST_N

12は、   入力 [ 3 0 ]  BW ;   //百

13  input [3:0] shiw; //十位

14  input [3:0] gew;  //个位

15  

16  output [9:0] binary; //转换结果

17  

18  reg [9:0] bwValue1; //百位BCD码转换寄存器1

19  reg [9:0] bwValue2; //百位BCD码转换寄存器2

20  reg [9:0] bwValue3; //百位BCD码转换寄存器3

21  reg [9:0] shiwValue1; //十位BCD码转换寄存器1

22  reg [9:0] shiwValue2; //十位BCD码转换寄存器2

23  reg [9:0] gewValue;    //个位BCD码转换寄存器

24  

25  /***********转换操作*******************/

26  always @(posedge clk or negedge rst_n)

27  if (!rst_n)

28      begin //寄存器赋初值

29          bwValue1 <= 0; 

30          bwValue2 <= 0;

31          bwValue3 <= 0; 

32          shiwValue1 <= 0;

33          shiwValue2 <= 0;

34          gewValue <= 0;

35      end

36  else

37      begin

38      //由我们得出的规律可知:a*100=a*(64+32+4)=a*64+a*32+a*4

39      //=a000000+a00000+a00,即a左移6位加上左移5位加上a左移2位 

40          bwValue1 <= bw<<6; 

41          bwValue2 <= bw<<5; 

42          bwValue3 <= bw<<2; 

43      //由我们得出的规律可知:a*10=a*(8+2)=a*8+a*2 =a000+a0,

44      //即a左移3位加上左移1位               

45          shiwValue1 <= shiw<<3;

46          shiwValue2 <= shiw<<1;    

47          gewValue <= gew; //个位数据不变

48      end 

49  //将所有的各个位的转换结果相加就是转换后的二进制数

50  assign binary = bwValue1 + bwValue2 + bwValue3 + shiwValue1

51                  + shiwValue2 + gewValue;

52  

53  endmodule

18~23行我们定义了BCD码转换需要用到的寄存器,因为我们从算法原理这一部分中总结的规律是:百位的BCD码转换需要(a*100=a*(64+32+4)=a*64+a*32+a*4=a000000+a00000+a00,即a左移6位加上左移5位加上a左移2位)三部分组成,所以需要三组寄存器,同理十位和个位也分别需要两组和一组寄存器;37~48行测试执行移位操作,50~51行将移位的结果输出。

 测试代码如下:

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function: BCD码转二进制数测试模块 *****************************************************/

01  `timescale 1ns/1ps

02

03  module bcd_to_bin_tb;

04

05      reg clk;

06      reg rst_n;

07      reg [3:0] bw;   //百位

08      reg [3:0] shiw; //十位

09      reg [3:0] gew;  //个位

10      

11      wire [9:0] binary;

12      

13      initial begin

14          clk = 0;

15          rst_n = 0;

16         bw = 4'd0; shiw = 4'd0; gew = 4'd0;

17          #1000 rst_n = 1;

18          

19          #100 bw = 4'd1; shiw = 4'd2; gew = 4'd0; //120

20          #100 bw = 4'd3; shiw = 4'd2; gew = 4'd9; //329

21          #100 bw = 4'd7; shiw = 4'd0; gew = 4'd3; //703

22          #100 bw = 4'd0; shiw = 4'd2; gew = 4'd7; //027

23          #100 bw = 4'd2; shiw = 4'd9; gew = 4'd0; //290

24          

25      end

26      

27      always #10 clk = ~clk;

28      

29       bcd_to_bin bcd_to_bin(

30        .clk(clk),         //系统50Mhz时钟

31        .rst_n(rst_n),   //系统低电平复位

32        .bw(bw),         //输入的BCD码的百位

33        .shiw(shiw),     //输入的BCD码的十位

34        .gew(gew),       //输入的BCD码的个位   

35        .binary(binary)  //输出的二进制数

36       );

37      

38  endmodule

我们在测试代码中写入了5组BCD码来检测输出是否正确

仿真分析

 

 从仿真图可以看出,分别输入5组BCD码:120、329、703、27、290,观察输出可知转换之后的二进制数是正确的,成功的把BCD码转换成了二进制码。所以本次设计是成功的。

 

おすすめ

転載: www.cnblogs.com/mengyi1989/p/11521080.html