module counter_display(clock, slin, seg, sl); //定义模块结构 input clock; //定义输入时钟引脚
input [3:0] slin; /*设定开关,slin[0]复位slin[3:1],slin[1]为时钟门控,slin[2]选择显示
方式,slin[3]选择是否显示小数点*/
output [7:0] seg; //定义数码管段输出引脚,段码 output [3:0] sl; //定义数码管选择输出引脚,位码 //parameter first=4'b1110;
reg [7:0] seg_reg; //定义数码管段输出寄存器 reg [3:0] sl_reg; //定义数码管选择输出寄存器 reg [3:0] disp_dat; //定义显示数据寄存器 reg [27:0] count; //定义计数器寄存器 reg [3:0]sw; //slin决定其状态
always@(negedge slin[1] or negedge slin[0]) //复位后,slin[1]作为时钟的门控信号。 begin
if(slin[0]==0) sw[0]=0; else sw[0]=1; end
always@(negedge slin[2] or negedge slin[0]) //slin[2]选择1、2、3、4位显示 begin
if(slin[0]==0) sw[2:1]=0;
else sw[2:1]=sw[2:1]+1; end
assign clk=sw[0]&clock; //开关1作为时钟的门控 always@(posedge clk) //定义clock信号上升沿触发 begin
count=count+1; //计数器值加1 end
always@(sw[2] or sw[1] or count[23] or count[22]) //修改该参数可以改变显示的扫描速度 begin
case({sw[2:1],count[23:22]}) //开关2作为显示方式(1、2、3、4位显示)的选择 0:sl_reg=4'b0111; 1:sl_reg=4'b1110; 2:sl_reg=4'b1101; 3:sl_reg=4'b1011; 4:sl_reg=4'b0011; 5:sl_reg=4'b0110;
26
6:sl_reg=4'b1100; 7:sl_reg=4'b1001; 8:sl_reg=4'b1000; 9:sl_reg=4'b0001; 10:sl_reg=4'b0010; 11:sl_reg=4'b0100; 12:sl_reg=4'b0000; 13:sl_reg=4'b0000; 14:sl_reg=4'b0000; 15:sl_reg=4'b0000; endcase end
always@(count[20]) begin
disp_dat=count[25:22]; end
always@(disp_dat) begin
case(disp_dat) 4'h0:seg_reg = 8'hc0; 4'h1:seg_reg = 8'hf9; 4'h2:seg_reg = 8'ha4; 4'h3:seg_reg = 8'hb0; 4'h4:seg_reg = 8'h99; 4'h5:seg_reg = 8'h92; 4'h6:seg_reg = 8'h82; 4'h7:seg_reg = 8'hf8; 4'h8:seg_reg = 8'h80; 4'h9:seg_reg = 8'h90; 4'ha:seg_reg = 8'h88; 4'hb:seg_reg = 8'h83; 4'hc:seg_reg = 8'hc6; 4'hd:seg_reg = 8'ha1; 4'he:seg_reg = 8'h86; 4'hf:seg_reg = 8'h8e; endcase end
always@(negedge slin[0] or negedge slin[3]) begin if(slin[0]==0)
//定义显示数据触发事件 //若显示的数据 //显示数码输出 //选择输出数据 //显示0 //显示1 //显示2 //显示3 //显示4 //显示5 //显示6 //显示7 //显示8 //显示9 //显示a //显示b //显示c //显示d //显示e //显示f 27
sw[3]=1; else sw[3]=!sw[3]; end
assign sl=sl_reg; //输出数码管解码结果 assign seg[6:0]=seg_reg[6:0]; //输出数码管选择 assign seg[7]=seg_reg[7]&sw[3];
endmodule
28