FPAG学习笔记:BCD码驱动2位数码管(动态扫描)

来源:互联网 发布:sql语句求和1到50 编辑:程序博客网 时间:2024/06/11 16:54

1、用Verilog 在Nexys 3开发板上设计并实现BCD码驱动2位数码管,数码管采用动态扫描方式显示。

2、Verilog源码如下所示:

`timescale 1ns / 1ps               // 定义时间单位和事件单位、时间精度module seg2_7(                  input [7:0] x,                 // 每个4位开关输入一个BCD码,分别对应2个数码管的十进制数字    output reg[6:0] y,             // 8段数码管,不带dp位置,则一共7段,分别为a,b,c,d,e,f,g    output reg[3:0] digit_en,      // 定义位选控制寄存器,直接驱动位选,总线宽度设置为4    input clk                      // 2位数码管公用7位数据线,由于要扫描刷新各个数码管,因此需要用时钟定时,    );                             // clkdiv分频,保证扫描周期5ms-10msreg[19:0] clkdiv;                  // 定义分频器reg[3:0] digit;                    // 定义显示寄存器,位宽为4wire s;                            // 标志信号,标志当前扫描数码管位
// 引出标志定时信号线

assign s=clkdiv[19];               // 标志信号连接到clkdiv[19],2^19*(1/100M)=5ms
// 定义分频器:类比timer
always @(posedge clk) begin        // 定义分频计数器,相当于一个定时器clkdiv<=clkdiv+1;          // 时序逻辑过程赋值end
// 定义BCD寄存器,存储不同时刻的待显示的BCD码

always @(*) begin                  // 根据标志位s,决定显示寄存器的值case(s)                  0:digit=x[3:0];            // 寄存器digit转载第0位数码管的BCD输入1:digit=x[7:4];            // 寄存器digit装载第1位数码管的BCD输入default:digit=x[3:0];      // 指定默认状态endcaseend
// 定义数码管位控制寄存器,存储不同时刻生成的位控制字

always @(*) begin                  // 根据s状态决定位控制寄存器的值if(s==0)digit_en=4'b1110;  // 如果s==1,位控制寄存器的值为4'b1110,开启第0位位选elsedigit_en=4'b1101;  // 如果s==0,位控制寄存器的值为4'b1101,开启第1位位选end
// 显示寄存器,存储7seg译码器
always @(*) begin          // 定义7段译码器:BCD码-7段,理解:显示寄存器数据经过7段译码器输出到ycase(digit)0: y = 7'b0000001;1: y = 7'b1001111;2: y = 7'b0010010;3: y = 7'b0000110;4: y = 7'b1001100;5: y = 7'b0100100;6: y = 7'b0100000;7: y = 7'b0001111;8: y = 7'b0000000;9: y = 7'b0000100;'hA: y = 7'b0001000;'hB: y = 7'b1100000;'hC: y = 7'b0110001;'hD: y = 7'b1000010;'hE: y = 7'b0110000;'hF: y = 7'b0111000;default: y = 7'b0000001; endcaseendendmodule
3、编辑用户约束文件(user constraint file)
NET "x[1]" LOC = "V8";NET "x[2]" LOC = "U8";NET "x[3]" LOC = "N8";NET "x[4]" LOC = "M8";NET "x[5]" LOC = "V9";NET "x[6]" LOC = "T9";NET "x[7]" LOC = "T10";NET "clk"  LOC = "V10";NET "y[0]" LOC = "L14";NET "y[1]" LOC = "N14";NET "y[2]" LOC = "M14";NET "y[3]" LOC = "U18";NET "y[4]" LOC = "U17";NET "y[5]" LOC = "T18";NET "y[6]" LOC = "T17";NET "digit_en[0]" LOC = "N16";NET "digit_en[1]" LOC = "N15";NET "digit_en[2]" LOC = "P18";NET "digit_en[3]" LOC = "P17";





0 0
原创粉丝点击