赞
踩
目录
- `timescale 1ns / 1ps
-
- module seg_static(
- input Clk,
- input Reset_n,
- output reg [7:0] sel,
- output reg [7:0] seg
- );
-
- reg [3:0]num;
- reg add_flag;//数码管数值+1 标志信号
- reg [24:0]cnt_wait;//0.5s计数器
- parameter CNT_WAIT_MAX = 25000_000-1; //计数器最大值(0.5s)
-
- //十六进制数显示编码
- parameter SEG_0 = 8'b1100_0000, SEG_1 = 8'b1111_1001,
- SEG_2 = 8'b1010_0100, SEG_3 = 8'b1011_0000,
- SEG_4 = 8'b1001_1001, SEG_5 = 8'b1001_0010,
- SEG_6 = 8'b1000_0010, SEG_7 = 8'b1111_1000,
- SEG_8 = 8'b1000_0000, SEG_9 = 8'b1001_0000,
- SEG_A = 8'b1000_1000, SEG_B = 8'b1000_0011,
- SEG_C = 8'b1100_0110, SEG_D = 8'b1010_0001,
- SEG_E = 8'b1000_0110, SEG_F = 8'b1000_1110;
-
- parameter IDLE = 8'b1111_1111; //不显示状态
-
- //0.5S计数功能
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- cnt_wait <= 0;
- else if (cnt_wait == CNT_WAIT_MAX)
- cnt_wait <= 0;
- else
- cnt_wait <= cnt_wait +1;
- //数码管数值+1 标志信号实现逻辑(一个高脉冲)
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- add_flag <= 0;
- else if (cnt_wait == CNT_WAIT_MAX)
- add_flag <= 1;
- else
- add_flag <= 0;
-
- //num:从 4'h0 加到 4'hf 循环
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- num <= 0;
- else if(add_flag)
- num <= num +1;
- else
- num <= num;
-
- //sel:选中六个数码管(位选信号)
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- sel <= 8'b0000_0000;
- else
- sel <= 8'b1111_1111;
-
- //给要显示的值编码
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- seg <= IDLE;
- else begin
- case (num)
- 4'd0: seg <= SEG_0;
- 4'd1: seg <= SEG_1;
- 4'd2: seg <= SEG_2;
- 4'd3: seg <= SEG_3;
- 4'd4: seg <= SEG_4;
- 4'd5: seg <= SEG_5;
- 4'd6: seg <= SEG_6;
- 4'd7: seg <= SEG_7;
- 4'd8: seg <= SEG_8;
- 4'd9: seg <= SEG_9;
- 4'd10: seg <= SEG_A;
- 4'd11: seg <= SEG_B;
- 4'd12: seg <= SEG_C;
- 4'd13: seg <= SEG_D;
- 4'd14: seg <= SEG_E;
- 4'd15: seg <= SEG_F;
- default:seg <= IDLE ; //闲置状态,不显示
- endcase
- end
- endmodule

- `timescale 1ns / 1ps
-
-
- module seg_static_tb();
-
- reg Clk;
- reg Reset_n;
- wire [7:0]sel;
- wire [7:0]seg;
-
- seg_static seg_static(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .sel(sel),
- .seg (seg)
- );
-
- defparam seg_static.CNT_WAIT_MAX = 25000 - 1;
-
-
- initial Clk <= 1;
- always #10 Clk <= ~Clk;
-
- initial
- begin
- Reset_n <= 1'b0;
- #201
- Reset_n <= 1'b1;
- #8000000;
- $stop;
- end
-
- endmodule

- module hex8(
- input Clk,
- input Reset_n,
- input [31:0]Disp_Data,
- output reg [7:0]SEL,
- output reg [7:0]SEG
- );
-
- reg [29:0]cnt_1ms;
- reg Flag_1ms; //每1毫秒切换一个数码管
- reg [2:0]cnt_sel;//位选信号
- parameter MCNT = 50000-1;
-
- //定时一毫秒
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- cnt_1ms <= 0;
- else if(cnt_1ms == MCNT)
- cnt_1ms <= 0;
- else
- cnt_1ms <= cnt_1ms + 1;
-
- //产生一个一毫秒到来的高脉冲信号
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- Flag_1ms <= 0;
- else if(cnt_1ms == MCNT)
- Flag_1ms <= 1;
- else
- Flag_1ms <= 0;
-
- //cnt_sel自加逻辑实现(每1毫秒自加一次切换一个数码管)
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- cnt_sel <= 0;
- else if(Flag_1ms)
- cnt_sel <= cnt_sel + 1;
- else
- cnt_sel <= cnt_sel;
-
- //数码管的位选择逻辑
- always@(posedge Clk)begin
- case(cnt_sel)
- 0: SEL <= 8'b0000_0001;
- 1: SEL <= 8'b0000_0010;
- 2: SEL <= 8'b0000_0100;
- 3: SEL <= 8'b0000_1000;
- 4: SEL <= 8'b0001_0000;
- 5: SEL <= 8'b0010_0000;
- 6: SEL <= 8'b0100_0000;
- 7: SEL <= 8'b1000_0000;
- default:SEL <= 8'b0000_0000;
- endcase
- end
-
- reg [3:0]data_temp;//显示16种数值8 + 4 + 2 + 1+1 = 16,
- //建立一个查找表,表中列出SEG段选信号的各种情况。
- always@(posedge Clk)begin
- case(data_temp)
- 0: SEG <= 8'b1100_0000; //0
- 1: SEG <= 8'b1111_1001; //1
- 2: SEG <= 8'b1010_0100; //2
- 3: SEG <= 8'b1011_0000; //3
- 4: SEG <= 8'b1001_1001; //4
- 5: SEG <= 8'b1001_0010; //5
- 6: SEG <= 8'b1000_0010; //6
- 7: SEG <= 8'b1111_1000; //7
- 8: SEG <= 8'b1000_0000; //8
- 9: SEG <= 8'b1001_0000; //9
- 10: SEG <= 8'b1000_1000;//A
- 11: SEG <= 8'b1000_0011;//B
- 12: SEG <= 8'b1100_0110;//C
- 13: SEG <= 8'b1010_0001;//D
- 14: SEG <= 8'b1000_0110;//E
- 15: SEG <= 8'b1000_1110;//F
- default:SEL <= 8'b1111_1111;//全灭
- endcase
- end
-
- //8路选择器实现逻辑(使用组合逻辑时<=与=无区别)
- always@(*)
- case(cnt_sel)
- 0:data_temp <= Disp_Data[3:0];
- 1:data_temp <= Disp_Data[7:4];
- 2:data_temp <= Disp_Data[11:8];
- 3:data_temp <= Disp_Data[15:12];
- 4:data_temp <= Disp_Data[19:16];
- 5:data_temp <= Disp_Data[23:20];
- 6:data_temp <= Disp_Data[27:24];
- 7:data_temp <= Disp_Data[31:28];
- default:data_temp = 4'b0000;
- endcase
-
- endmodule

- //只需要对输入信号赋值
- `timescale 1ns / 1ps
- module hex8_tb();
-
- reg Clk;
- reg Reset_n;
- reg [31:0]Disp_Data;
- wire [7:0]SEL;
- wire [7:0]SEG;
-
- hex8 hex8(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Disp_Data(Disp_Data),
- .SEL(SEL),
- .SEG(SEG)
- );
-
- initial Clk = 1;
- always #10 Clk = ~Clk;
-
- initial
- begin
- Reset_n = 0;
- Disp_Data = 32'h12345678;
- #201;
- Reset_n = 1;
- #20000000;//延时20ms
- Disp_Data = 32'h9abcdef0;
- #20000000;//延时20ms
- $stop;
- end
- endmodule

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。