lcytms 发表于 2016-11-15 22:29:16

pre_shift预移位操作子模块,代码如下。
module pre_shift (d4in, d4out);

      input d4in;
      
      output 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

lcytms 发表于 2016-11-15 22:32:27

新建顶层模块top.v,将b2bcd模块和bcd2b模块置入其中进行例化。
module top (din, dout);

        input din;
       
        output dout;
       
        wire data;
       
        b2bcd b2bcd (.din(din), .dout(data));

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

endmodule

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 din;
       
        wire 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

lcytms 发表于 2016-11-15 22:36:39

仿真运行结果

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

lcytms 发表于 2016-11-15 22:40:26

用第二种方法实现BCD转二进制之后,我们来用第三种方法实现。
根据实现原理,改写bcd2b.v代码如下。
其中包含十进位子模块power10.v。
module bcd2b (din, dout);

        input din;
       
        output dout;
       
        wire data ;
       
        assign data = {20'b0, din};
       
                // operation power10        :        ab = a*10 + b
       
        power10 s1 (.datain(data), .dataout(data));
        power10 s2 (.datain(data), .dataout(data));
        power10 s3 (.datain(data), .dataout(data));
        power10 s4 (.datain(data), .dataout(data));
        power10 s5 (.datain(data), .dataout(data));
        power10 s6 (.datain(data), .dataout(data));

        assign dout = data;
       

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

lcytms 发表于 2016-11-15 22:42:23

新建十进位子模块power10.v。
power10.v模块代码如下。
module power10 (datain, dataout);

        input datain;
       
        output dataout;
       
        wire data;

        assign dataout = (datain<<3) + (datain<<1) + datain;        // BCD1*10 + BCD0
        assign dataout = {datain, datain};
       
endmodule

lcytms 发表于 2016-11-15 22:43:06

仿真运行结果

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

lcytms 发表于 2016-11-15 22:45:22

查看RTL视图——bcd2b.v

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

lcytms 发表于 2016-11-15 22:46:54

查看RTL视图——power10十进位子模块shift.v

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

lcytms 发表于 2016-11-15 22:47:23

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

课程到此结束,谢谢大家的关注!
页: 1 [2] 3
查看完整版本: FPGA初级课程第十三讲 BCD转二进制