• [笔记]再笔记边干边学Verilog HDL –007


    Lab07--数码管电路驱动

    本实验的目的是实现常用的7段码数码管电路的驱动,用动态扫描的方式实现,而且是同步动态扫描,因为DE2的数码管是直接驱动的,不能列扫描,所以本实验不适合DE2,但同样很经典。

    image

    期颐完成上图所示个各模块,构成数码管驱动电路。

    模块说明:

    1.取位模块:number_mod_module.v

    简单说就是我的输入数据时00-99的两位数,那么我要分别取出十位和个位的数字待用,这个模块实现很简单,用求商/得到十位的数字,用求余%得到个位的数字。

    2. 译码模块:smg_encoder_module.v

    译码模块将我们前面得到的十位和个位数字译成数码管的7位码(若用到那个小数点,就是8位码)。这里的电路里的数码管是共阳极的,所以0有效。

    3. 扫描模块:smg_scan_module.v

    扫描模块分为两部分,因为是同步扫描,所以要同时选定数码管(列扫描)和显示的数字(行扫描)。这里用50Hz的频率扫描,即10ms扫描一次,符合视觉暂留。

    代码

    number_mod_module.v

     1 /**
    2 * File name: number_mod_module.v
    3 *
    4 */
    5
    6 module number_mod_module
    7 (
    8 clk, rst_n,
    9 number_data,
    10 ten_data, one_data
    11 );
    12
    13 input clk;
    14 input rst_n;
    15 input [7:0] number_data;
    16 output [3:0] ten_data;
    17 output [3:0] one_data;
    18
    19 reg [31:0] rten;
    20 reg [31:0] rone;
    21
    22 always @(posedge clk or negedge rst_n)
    23 if (!rst_n)
    24 begin
    25 rten <= 32'd0;
    26 rone <= 32'd0;
    27 end
    28 else
    29 begin
    30 rten <= number_data / 10;
    31 rone <= number_data % 10;
    32 end
    33
    34 assign ten_data = rten[3:0];
    35 assign one_data = rone[3:0];
    36
    37 endmodule
    38

    smg_encoder_module.v

     1 /**
    2 * File name : smg_encoder_module.v
    3 *
    4 */
    5
    6 module smg_encoder_module
    7 (
    8 clk, rst_n,
    9 ten_data, one_data,
    10 ten_smg_data, one_smg_data
    11 );
    12
    13 input clk;
    14 input rst_n;
    15 input [3:0] ten_data;
    16 input [3:0] one_data;
    17 output [7:0] ten_smg_data;
    18 output [7:0] one_smg_data;
    19
    20 parameter _0 = 8'b1100_0000, _1 = 8'b1111_1001, _2 = 8'b1010_0100,
    21 _3 = 8'b1011_0000, _4 = 8'b1001_1001, _5 = 8'b1001_0010,
    22 _6 = 8'b1000_0010, _7 = 8'b1111_1000, _8 = 8'b1000_0000,
    23 _9 = 8'b1001_0000;
    24
    25 reg [7:0] rten_smg_data;
    26
    27 always @(posedge clk or negedge rst_n)
    28 if (!rst_n)
    29 begin
    30 rten_smg_data <= 8'b1111_1111;
    31 end
    32 else
    33 case (ten_data)
    34
    35 4'd0: rten_smg_data <= _0;
    36 4'd1: rten_smg_data <= _1;
    37 4'd2: rten_smg_data <= _2;
    38 4'd3: rten_smg_data <= _3;
    39 4'd4: rten_smg_data <= _4;
    40 4'd5: rten_smg_data <= _5;
    41 4'd6: rten_smg_data <= _6;
    42 4'd7: rten_smg_data <= _7;
    43 4'd8: rten_smg_data <= _8;
    44 4'd9: rten_smg_data <= _9;
    45 endcase
    46
    47 reg [7:0] rone_smg_data;
    48
    49 always @(posedge clk or negedge rst_n)
    50 if (!rst_n)
    51 begin
    52 rone_smg_data <= 8'b1111_1111;
    53 end
    54 else
    55 case (one_data)
    56 4'd0: rone_smg_data <= _0;
    57 4'd1: rone_smg_data <= _1;
    58 4'd2: rone_smg_data <= _2;
    59 4'd3: rone_smg_data <= _3;
    60 4'd4: rone_smg_data <= _4;
    61 4'd5: rone_smg_data <= _5;
    62 4'd6: rone_smg_data <= _6;
    63 4'd7: rone_smg_data <= _7;
    64 4'd8: rone_smg_data <= _8;
    65 4'd9: rone_smg_data <= _9;
    66 endcase
    67
    68 assign ten_smg_data = rten_smg_data;
    69 assign one_smg_data = rone_smg_data;
    70
    71 endmodule
    72
    73

    smg_scan_module.v

     1 /**
    2 * File name: smg_scan_module.v
    3 *
    4 */
    5
    6 module smg_scan_module
    7 (
    8 clk, rst_n,
    9 ten_smg_data, one_smg_data,
    10 row_scan_sig, column_scan_sig
    11 );
    12
    13 input clk;
    14 input rst_n;
    15 input [7:0] ten_smg_data;
    16 input [7:0] one_smg_data;
    17 output [7:0] row_scan_sig;
    18 output [1:0] column_scan_sig;
    19
    20 row_scan_module U1
    21 (
    22 .clk (clk),
    23 .rst_n (rst_n),
    24 .ten_smg_data (ten_smg_data),
    25 .one_smg_data (one_smg_data),
    26 .row_scan_sig (row_scan_sig)
    27 );
    28
    29 column_scan_module U2
    30 (
    31 .clk (clk),
    32 .rst_n (rst_n),
    33 .column_scan_sig (column_scan_sig)
    34 );
    35
    36 endmodule
    37

    column_scan_module.v

     1 /**
    2 * File name : column_scan_module.v
    3 *
    4 */
    5
    6 module column_scan_module
    7 (
    8 clk, rst_n, column_scan_sig
    9 );
    10
    11 input clk;
    12 input rst_n;
    13 output [1:0] column_scan_sig;
    14
    15 parameter T10MS = 18'd199_999;
    16
    17 reg [17:0] count;
    18
    19 always @(posedge clk or negedge rst_n)
    20 if (!rst_n)
    21 count <= 18'd0;
    22 else if (count == T10MS)
    23 count <= 18'd0;
    24 else
    25 count <= count + 18'b1;
    26
    27 reg [1:0] t;
    28
    29 always @(posedge clk or negedge rst_n)
    30 if (!rst_n)
    31 t <= 2'd0;
    32 else if (t == 2'd2)
    33 t <= 2'd0;
    34 else if (count == T10MS)
    35 t <= t + 1'b1;
    36
    37 reg [1:0] rcolumn_scan;
    38
    39 always @(posedge clk or negedge rst_n)
    40 if (!rst_n)
    41 rcolumn_scan <= 2'b10;
    42 else if (count == T10MS)
    43 case (t)
    44
    45 2'd0: rcolumn_scan <= 2'b10;
    46 2'd1: rcolumn_scan <= 2'b01;
    47
    48 endcase
    49
    50 assign column_scan_sig = rcolumn_scan;
    51
    52 endmodule
    53

    row_scan_module.v

     1 /**
    2 * File name : row_scan_module.v
    3 *
    4 */
    5
    6 module row_scan_module
    7 (
    8 clk, rst_n,
    9 ten_smg_data, one_smg_data,
    10 row_scan_sig
    11 );
    12
    13 input clk;
    14 input rst_n;
    15 input [7:0] ten_smg_data;
    16 input [7:0] one_smg_data;
    17 output [7:0] row_scan_sig;
    18
    19 parameter T10MS = 18'd199_999;
    20
    21 reg [17:0] count;
    22
    23 always @(posedge clk or negedge rst_n)
    24 if (!rst_n)
    25 count <= 18'd0;
    26 else
    27 count <= count + 18'b1;
    28
    29 reg [1:0] t;
    30
    31 always @(posedge clk or negedge rst_n)
    32 if (!rst_n)
    33 t <= 2'd0;
    34 else if (t == 2'd2)
    35 t <= 2'd0;
    36 else if (count == T10MS)
    37 t <= t + 1'b1;
    38
    39 reg [7:0] rdata;
    40
    41 always @(posedge clk or negedge rst_n)
    42 if (!rst_n)
    43 rdata <= 8'd0;
    44 else if (count == T10MS)
    45 case(t)
    46
    47 2'd0: rdata <= ten_smg_data;
    48 2'd1: rdata <= one_smg_data;
    49
    50 endcase
    51
    52 assign row_scan_sig = rdata;
    53
    54 endmodule
    55

    exp07_top.v

     1 /**
    2 * File name: exp07_top.v
    3 *
    4 */
    5
    6 module exp07_top
    7 (
    8 clk, rst_n,
    9 number_data,
    10 row_scan_sig, column_scan_sig
    11 );
    12
    13 input clk;
    14 input rst_n;
    15 input [7:0] number_data;
    16 output [7:0] row_scan_sig;
    17 output [1:0] column_scan_sig;
    18
    19 wire [3:0] ten_data;
    20 wire [3:0] one_data;
    21
    22 number_mod_module U1
    23 (
    24 .clk (clk),
    25 .rst_n (rst_n),
    26 .number_data (number_data),
    27 .ten_data (ten_data),
    28 .one_data (one_data)
    29 );
    30
    31 wire [7:0] ten_smg_data;
    32 wire [7:0] one_smg_data;
    33
    34 smg_encoder_module U2
    35 (
    36 .clk (clk),
    37 .rst_n (rst_n),
    38 .ten_data (ten_data),
    39 .one_data (one_data),
    40 .ten_smg_data (ten_smg_data),
    41 .one_smg_data (one_smg_data)
    42 );
    43
    44 smg_scan_module U3
    45 (
    46 .clk (clk),
    47 .rst_n (rst_n),
    48 .ten_smg_data (ten_smg_data),
    49 .one_smg_data (one_smg_data),
    50 .row_scan_sig (row_scan_sig),
    51 .column_scan_sig (column_scan_sig)
    52 );
    53
    54 endmodule
    55

    RTL图

    image

    小结

    本实验同样是低级建模,特点是模块多,各模块功能单一,易读易修改,各个模块的构造容易,直接.用简单的模块组合起来,实现复杂的功能.

  • 相关阅读:
    批量kill session实现脚本
    mysql 5.7.34 gtid 复制模式下执行 reset master 命令后 slave 节点的处理
    修改listener的inbound_connect_timeout参数的方法
    ORA-609 : opiodr aborting process unknown ospid
    mysqldump用法总结
    重置mysql主从同步:reset master和reset slave
    Too many connections
    redisson实现分布式锁(spring整合redisson)
    Caused by: java.lang.ClassNotFoundException: org.springframework.data.util.CloseableIterator
    Caused by: java.lang.ClassNotFoundException: org.springframework.data.keyvalue.core.mapping.context.KeyValueMappingContext
  • 原文地址:https://www.cnblogs.com/halflife/p/2110216.html
Copyright © 2020-2023  润新知