集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

FPGA初级课程第十三讲 BCD转二进制

[复制链接]
 楼主| lcytms 发表于 2016-11-15 22:29:16 | 显示全部楼层
pre_shift预移位操作子模块,代码如下。
module pre_shift (d4in, d4out);

        input [3:0] d4in;
        
        output [3:0] d4out;
        
        assign d4out = (d4in > 4) ? d4in + 4'd3 : d4in;         //如果大于四,则加三,否则不变。

//        always @ (*)
//                begin
//                        if (d4in > 4)
//                                begin
//                                        d4out = d4in + 3;
//                                end
//                        else
//                                begin
//                                        d4out = d4in;
//                                end
//                end

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:32:27 | 显示全部楼层
新建顶层模块top.v,将b2bcd模块和bcd2b模块置入其中进行例化。
module top (din, dout);

        input [19:0] din;
       
        output [19:0] dout;
       
        wire [23:0] data;
       
        b2bcd b2bcd (.din(din), .dout(data));

        bcd2b bcd2b (.din(data), .dout(dout));

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:35:00 | 显示全部楼层
本帖最后由 lcytms 于 2016-11-15 22:37 编辑

编写Testbench模块

Testbench模块top_tb.v文件如下:
`timescale 1ns/1ps

module top_tb;

        reg [19:0] din;
       
        wire [19:0] dout;
       
        integer i;
       
        top dut (.din(din), .dout(dout));

        initial
                begin
                        din = 0;
                        for (i=0; i<= 999999; i=i+1) #10 din = i;
                       
                        #100 $stop;
                end

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:36:39 | 显示全部楼层
仿真运行结果

设置好仿真之后,可以看到仿真结果。
此时将二进制部分的数据格式设置为无符号数Unsigned,将BCD部分的数据格式设置为十六进制数Hexadecimal。
可以看到两种不同码制的数据保持了完全一致。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:40:26 | 显示全部楼层
用第二种方法实现BCD转二进制之后,我们来用第三种方法实现。
根据实现原理,改写bcd2b.v代码如下。
其中包含十进位子模块power10.v。
module bcd2b (din, dout);

        input [23:0] din;
       
        output [19:0] dout;
       
        wire [43:0] data [6:0];
       
        assign data[0] = {20'b0, din};
       
                // operation power10        :        ab = a*10 + b
       
        power10 s1 (.datain(data[0]), .dataout(data[1]));
        power10 s2 (.datain(data[1]), .dataout(data[2]));
        power10 s3 (.datain(data[2]), .dataout(data[3]));
        power10 s4 (.datain(data[3]), .dataout(data[4]));
        power10 s5 (.datain(data[4]), .dataout(data[5]));
        power10 s6 (.datain(data[5]), .dataout(data[6]));

        assign dout = data[6][43:24];
       

//        assign dout =        din[3:0]                                                                                                                                 // BCD0
//                                                + (din[7:4]<<3) + (din[7:4]<<1)                                                                        // BCD1, 10=8+2
//                                                + (din[11:8]<<6) + (din[11:8]<<5) + (din[11:8]<<2)                        // BCD2, 100=64+32+4
//                                                + (din[15:12]<<10) - (din[15:12]<<4) - (din[15:12]<<3)        // BCD3, 1000=1024-16-8
//                                                                                                                                                        // BCD4, 10000 = 16*625 = 8192+2048-256+16
//                                                + (din[19:16]<<13) + (din[19:16]<<11) - (din[19:16]<<8) + (din[19:16]<<4)
//                                                        // BCD5, 100000 = 32*3125 = 32*(2048+1024+32+16+4+1) = 65536+32768+1024+512+128+32
//                                                + (din[23:20]<<16) + (din[23:20]<<15) + (din[23:20]<<10)
//                                                + (din[23:20]<<9) + (din[23:20]<<7) + (din[23:20]<<5);
                                               
endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:42:23 | 显示全部楼层
新建十进位子模块power10.v。
power10.v模块代码如下。
module power10 (datain, dataout);

        input [43:0] datain;
       
        output [43:0] dataout;
       
        wire [43:0] data;

        assign dataout[43:24] = (datain[43:24]<<3) + (datain[43:24]<<1) + datain[23:20];        // BCD1*10 + BCD0
        assign dataout[23:0] = {datain[19:0], datain[23:20]};
       
endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:43:06 | 显示全部楼层
仿真运行结果

重新运行仿真之后,可以看到仿真结果。
此时将二进制部分的数据格式设置为无符号数Unsigned,将BCD部分的数据格式设置为十六进制数Hexadecimal。
可以看到两种不同码制的数据保持了完全一致。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:45:22 | 显示全部楼层
查看RTL视图——bcd2b.v

顶层模块b2bcd.v的视图如下所示。可以看到6个子步power10十进位模块逐次递进的一个结果。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:46:54 | 显示全部楼层
查看RTL视图——power10十进位子模块shift.v

power10十进位子模块power10.v的RTL视图如下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-15 22:47:23 | 显示全部楼层
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了BCD转二进制的基本原理,并对BCD转二进制逻辑电路进行了建模、仿真,结合上一讲的二进制转BCD一起编写一个演示逻辑,进行了仿真检查。
希望大家掌握BCD转二进制的基本原理,并熟练运用Verilog语言编写相关逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。

课程到此结束,谢谢大家的关注!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-3 18:34 , Processed in 0.068761 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表