实验2 组合逻辑电路设计二进制码转换成 BCD 码

一  实验目的

1.熟悉VIVADO的编译环境

2.熟悉在 VIVADO 环境下运用 Verilog HDL 语言的编程开发流程,包括源程序的编写、编译、模拟仿真及程序下载。

  实验内容

1. VIVADO 环境下源程序的编写、编译

2. 模拟仿真

3. 程序下载

  实验要求

1.在VIVADO环境下完设计并实现一个4位二进制码转换成BCD码的转换器

2.在完成配置程序的下载,并在EGo1开发板上对程序进行最终验证

  实验原理

4位二进制码的范围是0000-1111,而4位BCD码的表示规则为0000-1001(表示一位十进制的0-9),因此4位二进制转换为BCD码会有一部分数值大于1001,因此BCD码需要进位进行表示,所以BCD码需要5位二进制。因此通过b[4]=a[3]&a[2]|a[3]&a[1];可以判断是否需要进位,如果输入的4位二进制大于等于1010时,就会进位,用5位二进制进行BCD码表示。

assign b[3]=a[3]&~a[2]&~a[1];表示输入的4位二进制码为1000、1001时,BCD码第四位输出为1。

assign b[2]=~a[3]&a[2]|a[2]&a[1];表示输入的4位二进制码为0111、0110、0101、0100时,BCD码第三位输出为1。

assign b[1]=a[3]&a[2]&~a[1]|~a[3]&a[1];表示输入的4位二进制码为0011、0010时,BCD码第二位输出为1。

assign b[0]=a[0];表示输出的BCD码第一位和输入的4位二进制码的第一位相同。

输入信号

输出信号

a3

a2

a1

a0

b4

b3

b2

b1

b0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

1

0

0

1

0

0

0

0

1

0

0

0

1

1

0

0

0

1

1

0

1

0

0

0

0

1

0

0

0

1

0

1

0

0

1

0

1

0

1

1

0

0

0

1

1

0

0

1

1

1

0

0

1

1

1

1

0

0

0

0

1

0

0

0

1

0

0

1

0

1

0

0

1

1

0

1

0

1

0

0

0

0

1

0

1

1

1

0

0

0

1

1

1

0

0

1

0

0

1

0

1

1

0

1

1

0

0

1

1

1

1

1

0

1

0

1

0

0

1

1

1

1

1

0

1

0

1

表1 4位二进制码转换为BCD码真值表

使用五位数码管输出BCD码,编译文件:

module shiyaner(
input [3:0] a,
output wire [4:0] b,
input clk,
output reg [6:0] seg_display,
output wire an2,
output[3:0]sm_wei,
output[7:0]sm_duan
);
assign b[4]=a[3]&a[2]|a[3]&a[1];
assign b[3]=a[3]&~a[2]&~a[1];
assign b[2]=~a[3]&a[2]|a[2]&a[1];
assign b[1]=a[3]&a[2]&~a[1]|~a[3]&a[1];
assign b[0]=a[0];
integer clk_cnt;
reg clk_400Hz;

always @(posedge clk)
if(clk_cnt == 32'd100000)
begin
clk_cnt <=1'b0;
clk_400Hz <= ~clk_400Hz;
end
else
clk_cnt <=clk_cnt+1'b1;
reg[3:0]wei_ctrl=4'b0001;
always@(posedge clk_400Hz)
wei_ctrl<={wei_ctrl[2:0],wei_ctrl[3]};
reg[3:0]duan_ctrl;
always @(wei_ctrl)
case(wei_ctrl)
4'b0001:duan_ctrl=b[0];
4'b0010:duan_ctrl=b[1];
4'b0100:duan_ctrl=b[2];
4'b1000:duan_ctrl=b[3];
default:duan_ctrl=4'hf;
endcase
reg [7:0]duan;
always @(duan_ctrl)
case(duan_ctrl)
4'h0:duan=8'b1100_0000;
4'h1:duan=8'b1111_1001;
4'h2:duan=8'b1010_0100;
4'h3:duan=8'b1011_0000;
4'h4:duan=8'b1001_1001;
4'h5:duan=8'b1001_0010;
4'h6:duan=8'b1000_0010;
4'h7:duan=8'b1111_1000;
4'h8:duan=8'b1000_0000;
4'h9:duan=8'b1001_0000;
endcase
assign sm_wei=wei_ctrl;
assign sm_duan=~duan;
assign an2=1;
always @(*) begin
case(b[4])
0:seg_display=7'b1111110;
1:seg_display=7'b0110000; // 1
2:seg_display=7'b1101101; // 2
3:seg_display=7'b1111001; // 3
4:seg_display=7'b0110011; // 4
5:seg_display=7'b1011011; // 5
6:seg_display=7'b1011111; // 6
7:seg_display=7'b1110000;// 7
endcase
end
endmodule

仿真文件:

`timescale 1ns / 1ps
module test;
reg [3:0] a;
wire[4:0] b;
shiyaner uut(a,b);
initial begin
     a=0000;
end
always #10  a=a+1;       
endmodule

约束文件:

set_property PACKAGE_PIN P17 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN R1 [get_ports a[0]]
set_property IOSTANDARD LVCMOS33 [get_ports a[0]]
set_property PACKAGE_PIN N4 [get_ports a[1]]
set_property IOSTANDARD LVCMOS33 [get_ports a[1]]
set_property PACKAGE_PIN M4 [get_ports a[2]]
set_property IOSTANDARD LVCMOS33 [get_ports a[2]]
set_property PACKAGE_PIN R2 [get_ports a[3]]
set_property IOSTANDARD LVCMOS33 [get_ports a[3]]
set_property PACKAGE_PIN K2 [get_ports b[0]]
set_property IOSTANDARD LVCMOS33 [get_ports b[0]]
set_property PACKAGE_PIN J2 [get_ports b[1]]
set_property IOSTANDARD LVCMOS33 [get_ports b[1]]
set_property PACKAGE_PIN J3 [get_ports b[2]]
set_property IOSTANDARD LVCMOS33 [get_ports b[2]]
set_property PACKAGE_PIN H4 [get_ports b[3]]
set_property IOSTANDARD LVCMOS33 [get_ports b[3]]
set_property PACKAGE_PIN J4 [get_ports b[4]]
set_property IOSTANDARD LVCMOS33 [get_ports b[4]]
set_property PACKAGE_PIN G6 [get_ports sm_wei[0]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_wei[0]]
set_property PACKAGE_PIN E1 [get_ports sm_wei[1]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_wei[1]]
set_property PACKAGE_PIN F1 [get_ports sm_wei[2]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_wei[2]]
set_property PACKAGE_PIN G1 [get_ports sm_wei[3]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_wei[3]]
set_property PACKAGE_PIN H1 [get_ports an2]
set_property IOSTANDARD LVCMOS33 [get_ports an2]
set_property PACKAGE_PIN D4 [get_ports sm_duan[0]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[0]]
set_property PACKAGE_PIN E3 [get_ports sm_duan[1]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[1]]
set_property PACKAGE_PIN D3 [get_ports sm_duan[2]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[2]]
set_property PACKAGE_PIN F4 [get_ports sm_duan[3]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[3]]
set_property PACKAGE_PIN F3 [get_ports sm_duan[4]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[4]]
set_property PACKAGE_PIN E2 [get_ports sm_duan[5]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[5]]
set_property PACKAGE_PIN D2 [get_ports sm_duan[6]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[6]]
set_property PACKAGE_PIN H2 [get_ports sm_duan[7]]
set_property IOSTANDARD LVCMOS33 [get_ports sm_duan[7]]
set_property PACKAGE_PIN B4 [get_ports seg_display[6]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[6]]
set_property PACKAGE_PIN A4 [get_ports seg_display[5]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[5]]
set_property PACKAGE_PIN A3 [get_ports seg_display[4]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[4]]
set_property PACKAGE_PIN B1 [get_ports seg_display[3]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[3]]
set_property PACKAGE_PIN A1 [get_ports seg_display[2]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[2]]
set_property PACKAGE_PIN B3 [get_ports seg_display[1]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[1]]
set_property PACKAGE_PIN B2 [get_ports seg_display[0]]
set_property IOSTANDARD LVCMOS33 [get_ports seg_display[0]]

(1)仿真波形

分析:a[3]到a[0]表示输入,b[4]到b[0]表示输出,当输入为0000-1001时,二进制和输出的BCD码的表示是一致的。当输入的二进制码大于等于10时,输出的BCD码产生一位进位,最高位为1,后面四位为原二进制码减去1010后的对应二进制码。可以观察到符合真值表,符合实验要求。

(2)EGO1开发板

分析:拨码开关SW3、SW2、SW1、SW0分别代表着输入二进制数的高位到低位,LED2的4-0代表着BCD码的五位输出,此外我还将程序扩展,使用五位数码管对输出的BCD码进行输出,进行测试,发现输入二进与输出BCD码均与真值表所写的一致,符合实验要求。

用0表示拨码开关状态为下,用1表示拨码开关状态为上。

用0表示发光二极管状态为灭,用1表示发光二极管状态为亮。

拨码开关状态(上或下)

发光二极管状态(亮或灭)

b3

b2

b1

b0

p4

p3

p2

p1

p0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

1

0

0

1

0

0

0

0

1

0

0

0

1

1

0

0

0

1

1

0

1

0

0

0

0

1

0

0

0

1

0

1

0

0

1

0

1

0

1

1

0

0

0

1

1

0

0

1

1

1

0

0

1

1

1

1

0

0

0

0

1

0

0

0

1

0

0

1

0

1

0

0

1

1

0

1

0

1

0

0

0

0

1

0

1

1

1

0

0

0

1

1

1

0

0

1

0

0

1

0

1

1

0

1

1

0

0

1

1

1

1

1

0

1

0

1

0

0

1

1

1

1

1

0

1

0

1

分析:输入为0000-1001时,二进制和输出的BCD码的表示是一致的。当输入的二进制码大于等于10时,输出的BCD码产生一位进位,最高位为1,后面四位为原二进制码减去1010后的对应二进制码。与真值表一一对应,符合实验要求。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值