集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

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

[复制链接]
 楼主| lcytms 发表于 2016-11-14 22:40:15 | 显示全部楼层
查看RTL视图——顶层模块b2bcd.v


顶层模块b2bcd.v的视图如下所示。
其中最下面为全局视图,上面为左边、右边的局部视图,可以看到17个子步shift移位模块逐次递进的一个结果。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:41:08 | 显示全部楼层
本帖最后由 lcytms 于 2016-11-14 22:45 编辑

查看RTL视图——shift移位子模块shift.v

shift移位子模块shift.v的RTL视图如下。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:42:22 | 显示全部楼层
查看RTL视图——preshift移位预操作子模块preshift.v


preshift移位预操作子模块preshift.v的RTL视图如下。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:47:22 | 显示全部楼层
加入数码管驱动模块seg7.v文件

为了更直观地看到数码管显示效果,在已经做好的工程文件中加入编写好的数码管驱动模块seg7.v文件。
数码管驱动模块seg7.v文件如下所示。

module seg7 (clk, rst_n, data, sel, seg);

        input clk, rst_n;
        input [23:0] data;
       
        output reg [2:0] sel;
        output reg [7:0] seg;
       
       
        reg [19:0] count;
        reg clk_1ms;
       
        always @ (posedge clk or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        clk_1ms <= 1;
                                end
                        else
                                begin
                                        if (count < 24999)
                                                begin
                                                        count <= count + 20'd1;
                                                end
                                        else
                                                begin
                                                        count <= 0;
                                                        clk_1ms <= ~clk_1ms;
                                                end
                                end
                end

               
        reg [2:0] state;
        reg [3:0] data_temp;

        always @ (posedge clk_1ms or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        sel <= 0;
                                        data_temp <= 0;
                                        state <= 0;
                                end
                        else
                                begin
                                        case (state)
                                        0        :        begin
                                                                sel <= 0;
                                                                data_temp <= data[23:20];
                                                                state <= 1;
                                                        end
                                       
                                        1        :        begin
                                                                sel <= 1;
                                                                data_temp <= data[19:16];
                                                                state <= 2;
                                                        end
                                       
                                        2        :        begin
                                                                sel <= 2;
                                                                data_temp <= data[15:12];
                                                                state <= 3;
                                                        end
                                       
                                        3        :        begin
                                                                sel <= 3;
                                                                data_temp <= data[11:8];
                                                                state <= 4;
                                                        end
                                       
                                        4        :        begin
                                                                sel <= 4;
                                                                data_temp <= data[7:4];
                                                                state <= 5;
                                                        end
                                       
                                        5        :        begin
                                                                sel <= 5;
                                                                data_temp <= data[3:0];
                                                                state <= 0;
                                                        end
                                       
                                        default        :        state <= 0;
                                       
                                        endcase
                                end
                end
       
       
        always @ (*)
                begin
                        if (!rst_n)
                                begin
                                        seg = 8'b1111_1111;
                                end
                        else
                                begin
                                        case (data_temp)
                                        0        :        seg = 8'b1100_0000;                //d0
                                        1        :        seg = 8'b1111_1001;                //d1
                                        2        :        seg = 8'b1010_0100;                //d2
                                        3        :        seg = 8'b1011_0000;                //d3
                                        4        :        seg = 8'b1001_1001;                //d4
                                        5        :        seg = 8'b1001_0010;                //d5
                                        6        :        seg = 8'b1000_0010;                //d6
                                        7        :        seg = 8'b1111_1000;                //d7
                                        8        :        seg = 8'b1000_0000;                //d8
                                        9        :        seg = 8'b1001_0000;                //d9
                                        10        :        seg = 8'b1000_1000;                //dA
                                        11        :        seg = 8'b1000_0011;                //db
                                        12        :        seg = 8'b1100_0110;                //dC
                                        13        :        seg = 8'b1010_0001;                //dd
                                        14        :        seg = 8'b1000_0110;                //dE
                                        15        :        seg = 8'b1000_1110;                //dF
                                        default        :        seg = 8'b1000_1110;                //dF
                                        endcase
                                end
                end

endmodule

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:53:25 | 显示全部楼层
新建数据控制模块data_controller.v
新建数据控制模块data_controller.v,循环生成要显示的数字000000~999999,显示数字每100ms更新一次,通过b2bcd模块转换成BCD码,然后输出给数码管驱动模块。
编写代码如下。
module data_controller (clk, rst_n, data);

        input clk, rst_n;
       
        output reg [19:0] data;
       
        reg [31:0] count;

        parameter T100ms = 5_000_000;                // 100ms / 20ns = 5_000_000
       
        always @ (posedge clk or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        count <= 0;
                                        data <= 0;
                                end
                        else
                                begin
                                        if (count < T100ms - 1)
                                                begin
                                                        count <= count + 1;
                                                end
                                        else
                                                begin
                                                        count <= 0;
                                                        if (data < 999999)
                                                                begin
                                                                        data <= data + 20'd1;
                                                                end
                                                        else
                                                                begin
                                                                        data <= 0;
                                                                end
                                                end
                                end
                end

endmodule

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:55:24 | 显示全部楼层
创建新的顶层模块top.v

创建新的顶层模块top.v,将以上三个模块置入其中进行例化。
修改显示控制参数T100ms,使显示数字每10ms更新一次。
新的顶层模块top.v文件如下所示。
module top (clk, rst_n, sel, seg);

        input clk, rst_n;

        output [2:0] sel;
        output [7:0] seg;
       
        wire [19:0] din;
        wire [23:0] dout;
       
        data_controller #(.T100ms(500_000)) data_controller (.clk(clk), .rst_n(rst_n), .data(din));

        b2bcd b2bcd (.din(din), .dout(dout));
       
        seg7 seg7 (.clk(clk), .rst_n(rst_n), .data(dout), .sel(sel), .seg(seg));

endmodule

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:56:16 | 显示全部楼层
参照.tcl文件设置好FPGA管脚


参照EP4CE10F17C8Nzx_1.tcl文件内容,对FPGA芯片管脚进行设置。

EP4CE10F17C8Nzx_1.tcl文件相关内容如下所示。FPGA芯片配置结果如图所示。

        #set_global_assignment -name FAMILY "Cyclone IV"
        #set_global_assignment -name DEVICE ep4ce10f17c8n

set_location_assignment PIN_E1    -to    clk        

# KEY 轻触按键
set_location_assignment PIN_L3    -to   key[0]         

# SEG7 x 8 七段数码管
set_location_assignment PIN_L6    -to   sel[2]
set_location_assignment PIN_N6    -to   sel[1]
set_location_assignment PIN_M7    -to   sel[0]
set_location_assignment PIN_T11   -to   seg[0]     
set_location_assignment PIN_T10   -to   seg[1]   
set_location_assignment PIN_T9    -to   seg[2]     
set_location_assignment PIN_T8    -to   seg[3]     
set_location_assignment PIN_T7    -to   seg[4]     
set_location_assignment PIN_T6    -to   seg[5]     
set_location_assignment PIN_T5    -to   seg[6]     
set_location_assignment PIN_T4    -to   seg[7]

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:56:54 | 显示全部楼层
.sof文件下载到FPGA


全编译FPGA工程,生成.sof文件,连接至芯ZX-1开发板并上电。
打开Programmer通过Jtag口,将.sof文件下载到FPGA进行在线仿真。
.sof文件下载界面如下图所示。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-14 22:57:53 | 显示全部楼层
开发板运行效果


开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。

本帖子中包含更多资源

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

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

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

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-23 23:55 , Processed in 0.063375 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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