EDA设计:显示译码器


前言

  本次主要介绍一下关于EDA的实验:显示译码器。


一、设计内容及原理

  (1)基础任务:完成由拨码开关输入一个四位二进制数,由数码管显示,(十六进制显示 0-9,A-F)。
  (2)提高任务:完成由拨码开关输入一个四位二进制数,由数码管显示(十进制显示)。

二、设计过程(及设计步骤)

2.1 基础任务

(1)源程序:

module decode(a,wei,b);  //声明模块名,端口信号
        input [3:0] a;   //a表示输入的一个四位二进制数
        output reg  wei=1'b1;    //wei是位选
        output reg [7:0] b;   //b是段选
        always@(a)    
        begin 
          case(a)  //不同的二进制数对应的数码管显示
               0:b=8'b11111100;
               1:b=8'b01100000;
               2:b=8'b11011010;
               3:b=8'b11110010;
               4:b=8'b01100110;
               5:b=8'b10110110;
               6:b=8'b10111110;
               7:b=8'b11100000;
               8:b=8'b11111110;
               9:b=8'b11110110;
              10:b=8'b11101110;
              11:b=8'b00111110;
              12:b=8'b10011100;
              13:b=8'b01111010;
              14:b=8'b10011110;
              15:b=8'b10001110;
           endcase
        end             
endmodule


(2)仿真程序:

module sim_decode(        
    );
    reg [3:0] a;
    wire [7:0] b;
    decode u1(   //实例化显示译码器
    .b(b),
    .a(a)
    );
    initial begin 
               a=4'b0000;  //a的初始值为0
    end   
    always #10  a=a+1'b1;  //每延迟10ns,对a进行加1,即在0-15之间循环
endmodule


(3)约束程序:

set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports {a[0]}]
set_property -dict {PACKAGE_PIN N4 IOSTANDARD LVCMOS33} [get_ports {a[1]}]
set_property -dict {PACKAGE_PIN M4 IOSTANDARD LVCMOS33} [get_ports {a[2]}]
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports {a[3]}]
set_property -dict {PACKAGE_PIN G2 IOSTANDARD LVCMOS33} [get_ports wei]  
set_property -dict {PACKAGE_PIN B4 IOSTANDARD LVCMOS33} [get_ports {b[7]}]  
set_property -dict {PACKAGE_PIN A4 IOSTANDARD LVCMOS33} [get_ports {b[6]}]  
set_property -dict {PACKAGE_PIN A3 IOSTANDARD LVCMOS33} [get_ports {b[5]}]
set_property -dict {PACKAGE_PIN B1 IOSTANDARD LVCMOS33} [get_ports {b[4]}]
set_property -dict {PACKAGE_PIN A1 IOSTANDARD LVCMOS33} [get_ports {b[3]}]
set_property -dict {PACKAGE_PIN B3 IOSTANDARD LVCMOS33} [get_ports {b[2]}]
set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports {b[1]}]
set_property -dict {PACKAGE_PIN D5 IOSTANDARD LVCMOS33} [get_ports {b[0]}]

2.2 提高任务

(1)源程序:

module decode(swi,wei,wei1,a,b);   //声明模块名,端口信号
        input [3:0] swi;   //swi表示输入的一个四位二进制数
        output reg  wei=1'b1;    //wei是位选
        output reg  wei1=1'b1;  //wei1是位选        
        output reg [7:0] b;   //b是段选
        output reg [7:0] a;  //a是段选
        always@(swi)    
        begin 
          case(swi)    //不同的二进制数对应的数码管十进制显示
               0:begin b=8'b11111100;a=8'b11111100;end
               1:begin b=8'b11111100;a=8'b01100000;end
               2:begin b=8'b11111100;a=8'b11011010;end
               3:begin b=8'b11111100;a=8'b11110010;end
               4:begin b=8'b11111100;a=8'b01100110;end
               5:begin b=8'b11111100;a=8'b10110110;end
               6:begin b=8'b11111100;a=8'b10111110;end
               7:begin b=8'b11111100;a=8'b11100000;end
               8:begin b=8'b11111100;a=8'b11111110;end
               9:begin b=8'b11111100;a=8'b11110110;end
               10:begin b=8'b01100000;a=8'b11111100;end
               11:begin b=8'b01100000;a=8'b01100000;end
               12:begin b=8'b01100000;a=8'b11011010;end
               13:begin b=8'b01100000;a=8'b11110010;end
               14:begin b=8'b01100000;a=8'b01100110;end
               15:begin b=8'b01100000;a=8'b10110110;end              
           endcase
        end             
endmodule


(2)仿真程序:

module sim_decode(        
    );
    reg [3:0] swi;
    wire [7:0] a;
    wire [7:0] b;
    decode u1(     //实例化显示译码器
    .swi(swi),
    .b(b),
    .a(a)
    );
    initial begin 
           swi=4'b0000;   //a的初始值为0
    end   
    always #10 {swi}=swi+1'b1; //每延迟10ns,对swi进行加1
endmodule

(3)约束程序:

set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports {swi[0]}]
set_property -dict {PACKAGE_PIN N4 IOSTANDARD LVCMOS33} [get_ports {swi[1]}]
set_property -dict {PACKAGE_PIN M4 IOSTANDARD LVCMOS33} [get_ports {swi[2]}]
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports {swi[3]}]
set_property -dict {PACKAGE_PIN H1 IOSTANDARD LVCMOS33} [get_ports wei]  
set_property -dict {PACKAGE_PIN G1 IOSTANDARD LVCMOS33} [get_ports wei1]  
set_property -dict {PACKAGE_PIN B4 IOSTANDARD LVCMOS33} [get_ports {b[7]}]  
set_property -dict {PACKAGE_PIN A4 IOSTANDARD LVCMOS33} [get_ports {b[6]}]  
set_property -dict {PACKAGE_PIN A3 IOSTANDARD LVCMOS33} [get_ports {b[5]}]
set_property -dict {PACKAGE_PIN B1 IOSTANDARD LVCMOS33} [get_ports {b[4]}]
set_property -dict {PACKAGE_PIN A1 IOSTANDARD LVCMOS33} [get_ports {b[3]}]
set_property -dict {PACKAGE_PIN B3 IOSTANDARD LVCMOS33} [get_ports {b[2]}]
set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports {b[1]}]
set_property -dict {PACKAGE_PIN D5 IOSTANDARD LVCMOS33} [get_ports {b[0]}]
set_property -dict {PACKAGE_PIN D4 IOSTANDARD LVCMOS33} [get_ports {a[7]}]
set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports {a[6]}]
set_property -dict {PACKAGE_PIN D3 IOSTANDARD LVCMOS33} [get_ports {a[5]}]
set_property -dict {PACKAGE_PIN F4 IOSTANDARD LVCMOS33} [get_ports {a[4]}]
set_property -dict {PACKAGE_PIN F3 IOSTANDARD LVCMOS33} [get_ports {a[3]}]
set_property -dict {PACKAGE_PIN E2 IOSTANDARD LVCMOS33} [get_ports {a[2]}]
set_property -dict {PACKAGE_PIN D2 IOSTANDARD LVCMOS33} [get_ports {a[1]}]
set_property -dict {PACKAGE_PIN H2 IOSTANDARD LVCMOS33} [get_ports {a[0]}]

三、仿真结果

3.1  基础任务

在这里插入图片描述

  结果分析:a表示四位拨码开关输入,b对应数码管的输出数字,仿真和预期相符。例如上面黄线所示:a输入1101时,b输出应为b=8’b01111010,对应的16进制的d。

3.2 提高任务

在这里插入图片描述

  结果分析:swi表示四位拨码开关输入,a,b对应不同组数码管的输出数字,其中a是个位,b是十位,仿真和预期相符。例如上面黄线所示:a输入1101时,b=8’b01100000;a=8’b11110010,对应的10进制的13。

四、 硬件验证

4.1 基础任务

在这里插入图片描述

  结果分析:这是硬件仿真中的一个过程,拨码开关输入1100时,数码管显示16进制的C。

4.2 提高任务

在这里插入图片描述

  结果分析:这是硬件仿真中的一个过程,拨码开关输入1010时,数码管显示10进制的11。

五、 问题解决

  1.问题:使用数码管显示的两位数,结果总是一样的。
  解决办法:用两组数码管,将不同的二进制数对应数码管的十进制的个位和十位分别显示。
  2.问题:做提高任务时,源程序总是显示错误。
  解决办法:我是在基础任务程序上直接改的,但是把拨码开关和数码管的段选都命名为了a,导致错误,后来我将拨码开关命名为了swi。
  3.问题:源文件定义位选为高电平(wei= 1’b1)时,报错。
  解决办法:开始wei= 1’b1我写在了always之外,用的是assign wei= 1’b1,而我定义的是reg,因此显示错误。

六、 心得体会

  编写显示译码器时,我做了基础任务和提高任务。在这个编写程序的过程中,基础任务还是比较顺利的,但是在做提高任务时,同时显示两位数码管遇到了麻烦。
  最开始我打算用一组数码管的其中两位来显示,但是我做好后只能显示其中一位,无法同时显示不同的两位数。后来我查阅资料,发现需要利用人眼的分辨能力有限这个特点,同一时刻只有一个数码管点亮, 2个数码循环快速被点亮,这样人看到的效果将是2个数码管同时被点亮。但是这样写的话,涉及到的程序会比较复杂,因此,在这里我取巧了,用了两组数码管,将不同的二进制数对应数码管的十进制的个位和十位分别显示。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道无方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值