Verilog上机实验(一):BCD码交替显示控制器

实验要求*

第一步:

首先设计一个Binary-to-BCD译码器(二进制数转换成十进制数)模块:
它有4bit 输入:
SW3,SW2,SW1,SW0(在实验中如果嫌麻烦可以直接使用reg [3:0] SW 数组进行代替)
例如:
若输入组合为:
“1111”,则X7~X0输出为:“00010101”
其次设计一个BCD-to-7-segment译码器模块:
它有4bit输入:
X3,X2,X1,X0,
7bit输出:
A,B,C,D,E,F,G 用于控制LED display 的七段
7端字母的对应关系如下:
在这里插入图片描述
在这里插入图片描述

第二步:

设计一个BCD交替显示控制模块:
将它与第一步的两个实验相结合,实现Binary-to-BCD的交替显示控制功能:
将拨位开关SW7~SW0代表的8位二进制数转换成三位的Hrs,Tens,Ones,并驱动多个数码管显示,其中SegSel用于控制哪个数码管的显示
在这里插入图片描述

使用器件:

xc7a35tcpg236-1

使用软件:

vivado

在这里插入图片描述

vivado工作界面

在这里插入图片描述

工程结构

在这里插入图片描述

综合结果

在这里插入图片描述

多工器

在这里插入图片描述

刷新电路

在这里插入图片描述

BCD译码器

如下图相同结构的八层迭代
在这里插入图片描述

扫描二维码关注公众号,回复: 11569485 查看本文章

仿真结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

命令行输出

在这里插入图片描述

实验效果

在这里插入图片描述

核心代码:

顶层模块代码:

module Top_Module(
    input Clk,
    input SW7,
    input SW6,
    input SW5,
    input SW4,
    input SW3,
    input SW2,
    input SW1,
    input SW0,
    output A,
    output B,
    output C,
    output D,
    output E,
    output F,
    output G,
    output [3:0]SegSel_n
    );
    wire [7:0]SW;
    wire [3:0]Hrs;
    wire [3:0]Tens;
    wire [3:0]Ones;
    wire [3:0]Dval;
    wire [6:0]L;
    wire [3:0]SegSel;
    assign SW={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0};
    Refresh R1(.Clk(Clk),.Rst(1'b0),.SegSel(SegSel));
    binary_to_BCD B1(.SW(SW),.Hrs(Hrs),.Tens(Tens),.Ones(Ones));
    MUX M1(.Refresh(SegSel),.Dval(Dval),.Hrs(Hrs),.Tens(Tens),.Ones(Ones));
    
    
    
    BCD_to_7_segment S1(.X(Dval),.Lights(L));
    assign {A,B,C,D,E,F,G}=~L;
    assign SegSel_n=~SegSel;
endmodule

刷新电路模块代码:

module Refresh(Clk,Rst,SegSel

    );
    input Clk,Rst;
    output reg [3:0]SegSel;
    initial begin
    SegSel=4'b0001;
    end
    reg [7:0] count_fst;
    reg[3:0]count_second;
    always@(posedge Clk)begin
        if(Rst==1) begin
            count_fst<=8'b00000000;
            SegSel<=4'b0000;
        end
        else begin
            if(count_fst==8'b11111111)
                begin
                count_fst<=4'b00000000;
                count_second<=count_second+1'b1;
                if(count_second==4'b1111)begin
                count_second<=4'b0000;
                case(SegSel)
                    4'b0000:SegSel<=4'b0001;
                    4'b0001:SegSel<=4'b0010;
                    4'b0010:SegSel<=4'b0100;
                    4'b0100:SegSel<=4'b1000;
                    4'b1000:SegSel<=4'b0001;
                    default:SegSel<=4'b0000;
                endcase
            end
            end
            else count_fst<=count_fst+8'b00000001;
        end
    end
endmodule


binary-to-BCD模块代码:

module binary_to_BCD(SW,Hrs,Tens,Ones);
    input [7:0] SW;
    output [3:0]Hrs;
    output [3:0]Tens;
    output [3:0]Ones;
    reg [17:0] Z;
    always@(SW)begin
    Z=18'b0;
    Z[7:0]=SW;
    repeat(8)
    begin
    if(Z[11:8]>4)
        Z[11:8]=Z[11:8]+2'b11;
    if(Z[15:12]>4)
        Z[15:12]=Z[15:12]+2'b11;
    Z[17:1]=Z[16:0];
    end
    
    end
    assign Hrs=Z[17:16];
    assign Tens=Z[15:12];
    assign Ones=Z[11:8];
           
endmodule

多工器模块代码:

module MUX(Refresh,Dval,Hrs,Tens,Ones

    );
    input [3:0] Refresh;
    input [3:0]Tens;
    input [3:0]Hrs;
    input [3:0]Ones;
    output reg [3:0]Dval;
    always@(*) begin
    case(Refresh)
        4'b0000:Dval=4'b0000;
        4'b0001:Dval=Ones;
        4'b0010:Dval=Tens;
        4'b0100:Dval=Hrs;
        default:Dval=4'b0000;
    endcase
    end
        
endmodule

BCD_to_7_segment模块代码:

module BCD_to_7_segment(X,Lights);
input [3:0] X;
output reg [6:0] Lights;
reg X3,X2,X1,X0;
reg A,B,C,D,E,F,G;
always @(X)begin
    {X3,X2,X1,X0}=X;
    case({X3,X2,X1,X0})
        4'd0:{A,B,C,D,E,F,G}=7'b1111110;
        4'd1:{A,B,C,D,E,F,G}=7'b0110000;
        4'd2:{A,B,C,D,E,F,G}=7'b1101101;
        4'd3:{A,B,C,D,E,F,G}=7'b1111001;
        4'd4:{A,B,C,D,E,F,G}=7'b0110011;
        4'd5:{A,B,C,D,E,F,G}=7'b1011011;
        4'd6:{A,B,C,D,E,F,G}=7'b1011111;
        4'd7:{A,B,C,D,E,F,G}=7'b1110000;
        4'd8:{A,B,C,D,E,F,G}=7'b1111111;
        4'd9:{A,B,C,D,E,F,G}=7'b1111011;
        default {A,B,C,D,E,F,G}=7'b0000000;
        endcase
        Lights={A,B,C,D,E,F,G};
        end
endmodule

对于Binary-to-BCD还有另外一种思路

本实验中采用的思路是+3移位取出整数位
这种思路没有那么直观但是高效
另外一种是直接采用C语言的取模除10的思想
这种思路比较简单直接,但是综合之后的电路更加复杂,代价很大,但是同样也能实现目标

代码如下

module Tir_Deci(
    input [7:0] SW,
    output [6:0] hrs_Linght,
    output [6:0] hens_Linght,
    output [6:0] ones_Linght
    );
    reg [7:0]Hrs;
    reg [7:0]Tens;
    reg [7:0]Ones;
    wire [7:0] hrs;
    wire [7:0] tens;
    wire [7:0] ones;
    BCD_to_7_segment UUT1(.X(hrs[3:0]),.Lights(hrs_Linght));
    BCD_to_7_segment UUT2(.X(tens[3:0]),.Lights(tens_Linght));
    BCD_to_7_segment UUT3(.X(ones[3:0]),.Lights(ones_Linght));
    binary_to_BCD UU1(.SW(Hrs[3:0]),.BCD(hrs));
    binary_to_BCD UU2(.SW(Tens[3:0]),.BCD(tens));
    binary_to_BCD UU3(.SW(Ones[3:0]),.BCD(ones));
    integer i;
    always@(SW)begin
        i=SW;
        Hrs=i/100;
        Tens=(i/10)%10;
        Ones=(i%10);
    end
endmodule

测试模块代码:

代码结构
代码结构

module Test_bench(

    );
    reg clk;
    reg SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0;
    wire A,B,C,D,E,F,G;
    wire [3:0]SegSel;
    integer i;
    Top_Module Top(.Clk(clk),.SW7(SW7),.SW6(SW6),.SW5(SW5),.SW4(SW4),.SW3(SW3),.SW2(SW2),.SW1(SW1),
    .SW0(SW0),.A(A),.B(B),.C(C),.D(D),.E(E),.F(F),.G(G),.SegSel_n(SegSel)); 
    initial begin
    clk<=0;
    {SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}<=8'b0;
    end
    always begin
    #5 clk<=~clk;
    #100 {SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}<={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0}+8'b1;
    i={SW7,SW6,SW5,SW4,SW3,SW2,SW1,SW0};
    $write("Iteration %0d",i);
    $write("{%0d,%0d,%0d,%0d}",SegSel[3],SegSel[2],SegSel[1],SegSel[0]);
    $write("{%0d,%0d,%0d,%0d,%0d,%0d,%0d}\n",A,B,C,D,E,F,G);
        if (A) $write(" __\n");else $write("\n");
        if (F) $write("|");else $write(" ");
        if (G) $write("__");else $write("  ");
        if (B) $write("|\n");else $write("\n");
        if (E) $write("|");else $write(" ");
        if (D) $write("__");else $write("  ");
        if (C) $write("|\n");else $write(" \n");
    end
endmodule

实验效果已经在代码前面给出
对于Vivado的使用操作会在其他相关的博文说明

约束文件

set_property IOSTANDARD LVCMOS33 [get_ports B]
set_property IOSTANDARD LVCMOS33 [get_ports C]
set_property IOSTANDARD LVCMOS33 [get_ports Clk]
set_property IOSTANDARD LVCMOS33 [get_ports D]
set_property IOSTANDARD LVCMOS33 [get_ports E]
set_property IOSTANDARD LVCMOS33 [get_ports A]
set_property IOSTANDARD LVCMOS33 [get_ports F]
set_property IOSTANDARD LVCMOS33 [get_ports G]
set_property IOSTANDARD LVCMOS33 [get_ports SW1]
set_property IOSTANDARD LVCMOS33 [get_ports SW0]
set_property IOSTANDARD LVCMOS33 [get_ports SW3]
set_property IOSTANDARD LVCMOS33 [get_ports SW4]
set_property IOSTANDARD LVCMOS33 [get_ports SW5]
set_property IOSTANDARD LVCMOS33 [get_ports SW6]
set_property IOSTANDARD LVCMOS33 [get_ports SW7]
set_property IOSTANDARD LVCMOS33 [get_ports SW2]
set_property PACKAGE_PIN W16 [get_ports SW2]
set_property PACKAGE_PIN W17 [get_ports SW3]
set_property PACKAGE_PIN W15 [get_ports SW4]
set_property PACKAGE_PIN V15 [get_ports SW5]
set_property PACKAGE_PIN W14 [get_ports SW6]
set_property PACKAGE_PIN W13 [get_ports SW7]
set_property PACKAGE_PIN W7 [get_ports A]
set_property PACKAGE_PIN W6 [get_ports B]
set_property PACKAGE_PIN U8 [get_ports C]
set_property PACKAGE_PIN V8 [get_ports D]
set_property PACKAGE_PIN U5 [get_ports E]
set_property PACKAGE_PIN V5 [get_ports F]
set_property PACKAGE_PIN U7 [get_ports G]
set_property PACKAGE_PIN W5 [get_ports Clk]
set_property PACKAGE_PIN V17 [get_ports SW0]
set_property PACKAGE_PIN V16 [get_ports SW1]



set_property PACKAGE_PIN W4 [get_ports {SegSel_n[3]}]
set_property PACKAGE_PIN V4 [get_ports {SegSel_n[2]}]
set_property PACKAGE_PIN U4 [get_ports {SegSel_n[1]}]
set_property PACKAGE_PIN U2 [get_ports {SegSel_n[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {SegSel_n[0]}]

猜你喜欢

转载自blog.csdn.net/weixin_43442427/article/details/107009970