EDA设计:三八译码器


前言

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


一、设计内容及原理

  (1)基础任务:设计一个带有使能端的三八译码器,要求使能端输入有三个,一个高电平输入有效,两个低电平输入有效,输入端是高电平输入有效,输出端是低电平输出有效,即74LS138,拨码开关作为输入,发光二极管作为输出。
  (2)提高任务:在基础任务的基础上,输出用一位数码管显示输出是第几位。

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

2.1 基础任务

(1)源程序:

module decode(a,b,c,en,led); //声明模块名,端口信号
        input [2:0] en;    //三位使能端输入
        input a;         //三位拨码开关输入
        input b;
        input c;
        output reg [7:0] led;   //8位led输出
        always@(a,b,c)    
        begin 
          if(en==3'b100)    // 使能端输入100时,有效
          case({a,b,c})      //三位拨码开关输入不同的值时,对应led的输出
             3'd0:led = 8'b00000001;
             3'd1:led = 8'b00000010;
             3'd2:led = 8'b00000100;
             3'd3:led = 8'b00001000;
             3'd4:led = 8'b00010000;
             3'd5:led = 8'b00100000;
             3'd6:led = 8'b01000000;
             3'd7:led = 8'b10000000;
           endcase
          else led = 8'b00000000;  //使能端无效时,led不亮起
        end             
endmodule

(2)仿真程序:

module sim_decode;
    reg [2:0] en;
    reg a;
    reg b;
    reg c;
    wire[7:0] led;
    decode u0(     //实例化三八译码器
    .a(a),
    .b(b),
    .c(c),
    .en(en),
    .led(led)
    );
    initial begin
       en=3'b100;        //定义使能端有效
       a=0;b=0;c=0;     //初始值为0
    end
    always #10{a,b,c}={a,b,c}+1;  //每隔10ns,对swi进行加1   
endmodule

(3)约束程序:

set_property -dict {PACKAGE_PIN P3  IOSTANDARD LVCMOS33} [get_ports {en[0]}]
set_property -dict {PACKAGE_PIN P4  IOSTANDARD LVCMOS33} [get_ports {en[1]}]
set_property -dict {PACKAGE_PIN P5  IOSTANDARD LVCMOS33} [get_ports {en[2]}]
set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports c]
set_property -dict {PACKAGE_PIN N4 IOSTANDARD LVCMOS33} [get_ports b]
set_property -dict {PACKAGE_PIN M4 IOSTANDARD LVCMOS33} [get_ports a]
set_property -dict {PACKAGE_PIN K3 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN M1 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN L1 IOSTANDARD LVCMOS33} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN K6 IOSTANDARD LVCMOS33} [get_ports {led[3]}]
set_property -dict {PACKAGE_PIN J5 IOSTANDARD LVCMOS33} [get_ports {led[4]}]
set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33} [get_ports {led[5]}]
set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {led[6]}]
set_property -dict {PACKAGE_PIN K1 IOSTANDARD LVCMOS33} [get_ports {led[7]}]

2.2 提高任务

(1)源程序:

module decode(a,b,c,en,wei,led,seg);  //声明模块名,端口信号
        input [2:0] en;  //三位使能端输入
        input a;         //三位拨码开关输入      
        input b;
        input c;
        output reg wei;
        output reg [7:0] led;   
        output reg [7:0] seg;
        always@(a,b,c)    
        begin  
          if(en==3'b100)    // 使能端输入100时,有效     
          case({a,b,c})     //三位拨码开关输入不同的值时,对应led的输出
             3'd0:led = 8'b00000001;
             3'd1:led = 8'b00000010;
             3'd2:led = 8'b00000100;
             3'd3:led = 8'b00001000;
             3'd4:led = 8'b00010000;
             3'd5:led = 8'b00100000;
             3'd6:led = 8'b01000000;
             3'd7:led = 8'b10000000;
           endcase
          else led = 8'b00000000;  //使能端无效时,led不亮起
        end             
       always@(a,b,c) 
       begin  
           wei= 1'b1;
          if(en==3'b100)    // 使能端输入100时,有效    
          case({a,b,c})      //三位拨码开关输入不同的值时,对应数码管的输出
               0:seg=8'b11111100;
               1:seg=8'b01100000;
               2:seg=8'b11011010;
               3:seg=8'b11110010;
               4:seg=8'b01100110;
               5:seg=8'b10110110;
               6:seg=8'b10111110;
               7:seg=8'b11100000;
         endcase
       else  seg=8'b00000000;  //使能端无效时,数码管显示0
      end    
endmodule

(2)仿真程序:

module sim_decode;
    reg a;
    reg b;
    reg c;
    reg [2:0] en;
    wire[7:0] led;
    wire[7:0] seg;
    decode u0(        //实例化三八译码器
    .a(a),
    .b(b),
    .c(c),
    .led(led),
    .en(en),
    .seg(seg)
    );
    initial begin
       en=3'b100;        //定义使能端有效
       a=0;b=0;c=0;     //初始值为0
    end
    always #10{a,b,c}={a,b,c}+1;  //每延迟10,对abc进行加1,即在0-7之间循环
endmodule 

(3)约束程序:

set_property -dict {PACKAGE_PIN P3  IOSTANDARD LVCMOS33} [get_ports {en[0]}]
set_property -dict {PACKAGE_PIN P4  IOSTANDARD LVCMOS33} [get_ports {en[1]}]
set_property -dict {PACKAGE_PIN P5  IOSTANDARD LVCMOS33} [get_ports {en[2]}]
set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports c]
set_property -dict {PACKAGE_PIN N4 IOSTANDARD LVCMOS33} [get_ports b]
set_property -dict {PACKAGE_PIN M4 IOSTANDARD LVCMOS33} [get_ports a]
set_property -dict {PACKAGE_PIN K3 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN M1 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN L1 IOSTANDARD LVCMOS33} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN K6 IOSTANDARD LVCMOS33} [get_ports {led[3]}]
set_property -dict {PACKAGE_PIN J5 IOSTANDARD LVCMOS33} [get_ports {led[4]}]
set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33} [get_ports {led[5]}]
set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {led[6]}]
set_property -dict {PACKAGE_PIN K1 IOSTANDARD LVCMOS33} [get_ports {led[7]}]
set_property -dict {PACKAGE_PIN G2 IOSTANDARD LVCMOS33} [get_ports wei]  
set_property -dict {PACKAGE_PIN B4 IOSTANDARD LVCMOS33} [get_ports {seg[7]}]  
set_property -dict {PACKAGE_PIN A4 IOSTANDARD LVCMOS33} [get_ports {seg[6]}]  
set_property -dict {PACKAGE_PIN A3 IOSTANDARD LVCMOS33} [get_ports {seg[5]}]
set_property -dict {PACKAGE_PIN B1 IOSTANDARD LVCMOS33} [get_ports {seg[4]}]
set_property -dict {PACKAGE_PIN A1 IOSTANDARD LVCMOS33} [get_ports {seg[3]}]
set_property -dict {PACKAGE_PIN B3 IOSTANDARD LVCMOS33} [get_ports {seg[2]}]
set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports {seg[1]}]
set_property -dict {PACKAGE_PIN D5 IOSTANDARD LVCMOS33} [get_ports {seg[0]}]

三、仿真结果

3.1  基础任务

在这里插入图片描述

  结果分析:a,b,c表示三位拨码开关输入,8位led表示输出结果,仿真和预期相符。例如上面黄线所示:打开使能端(en=100),abc输入111时,输出应为7,led的第七位亮起。

3.2 提高任务

在这里插入图片描述

  结果分析:a,b,c表示三位拨码开关输入,8位led表示输出结果,seg表示对应数码管的输出数字,仿真和预期相符。例如上面黄线所示:打开使能端(en=100),abc输入111时,输出应为7,led的第七位亮起,

四、 硬件验证

4.1 基础任务

在这里插入图片描述
  结果分析:这是硬件仿真中的一个过程,拨码开关输入110时,对应的第6个led亮起。

4.2 提高任务

在这里插入图片描述
  结果分析:这是硬件仿真中的一个过程,拨码开关输入111时,对应的第7个led亮起,数码管显示7。

五、 问题解决

  1.问题:仿真时,显示仿真程序有好几个错误。
  解决办法:我按照vivado下面的错误提示,一一对照,根本就没有发现错误,结果是实例化源程序时,最后一行的.seg(seg)后面加了一个逗号。
  2.问题:仿真后出结果后,但是led一直显示0,没有变化,和预期结果不符。
  解决办法:我发现是仿真文件中没有定义使能端的位数(reg en),导致默认en为一位,故一直没有打开使能端,输出led为0。
  3.问题:编写的约束文件总是显示到某一行有错误。
  解决办法:编写的约束文件时主要有三个地方需要注意:(1)约束文件的注释符和源文件不一样,应该用##,而不是//。(2)引脚间要注意有空格。(3)端口信号是一位时,不需要用{}。例如[get_ports {led}]是错误的,应该写成[get_ports led]。

六、 心得体会

  编写三八译码器时,我做了基础任务和提高任务。在这个编写程序的过程中,还是遇到点麻烦。
  首先就是使能端的添加,这里我在if语句中套用了一个case语句,如果使能端输入100时,就可以选择三位拨码开关对应输入不同的值,然后表示出led的输出。但是硬件仿真时,8个led一直是常亮的,后来才发现是忘记了添加led都是低电平的情况(led = 8’b00000000)。
  还有就是仿真时显示仿真程序有好几个错误,我在这一步上花费了很长的时间。我按照vivado下面的错误提示,一一对照,根本就没有发现错误,结果是实例化源程序时,最后一行的.seg(seg)后面加了一个逗号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道无方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值