涉及到需要时间的并且在不同的时间执行程序时就要用到分频计数器至于需要分频多少看需要执行多少次,也就是需要用到的时间有多少次。
3-8 译码器
//学习3 8译码器的原理, //拨码开关的 1 2 3作为输入
//本实验采用拨码开关来作为输入,LED作为状态显示
//当然如果你的学习板没有拨码开关,可以用key1 key2 key3 作为数据输入。 module decoder_38(out,key_in);
output[7:0] out; //3 8译码器输出有8钟状态,所以要8个LED灯。 input[2:0] key_in; //(1 2 3)key1 key2 key3 作为数据输入 reg[7:0] out;
always @(key_in) begin
case(key_in)
3'd0: out=8'b11111110; //LED作为状态显示,低电平有效 3'd1: out=8'b11111101; 3'd2: out=8'b11111011; 3'd3: out=8'b11110111; 3'd4: out=8'b11101111; 3'd5: out=8'b11011111; 3'd6: out=8'b10111111; 3'd7: out=8'b01111111; endcase end
endmodule
1位数码管动态显示 //一位数码管试验
//利用分频计数器得到数码管,效果
module SMG_LED (clk_50M,rst,led_bit,dataout);
input clk_50M,rst; //系统时钟50M输入 从12脚输入。 output [7:0] dataout; //我们这里用数码管, output led_bit; //一位数码管的位选择 reg [7:0] dataout; reg led_bit;
reg [27:0] count; //分频计数器 //分频计数器
always @ ( posedge clk_50M ) begin
count<=count+1; //计数器自加 end
always @ ( posedge clk_50M or negedge rst) begin
led_bit <= 'b0; //是数码管的位选择处于导通状态 case ( count[27:24] )
// case ( count[27:24] )这一句希望初学者看明白, // 也是分频的关键
// 在数码管上面显示0到F 0: dataout<=8'b11000000; //0 1: dataout<=8'b11111001; 2: dataout<=8'b10100100; 3: dataout<=8'b10110000; 4: dataout<=8'b10011001; 5: dataout<=8'b10010010; 6: dataout<=8'b10000010; 7: dataout<=8'b11111000; 8: dataout<=8'b10000000; 9: dataout<=8'b10010000; 10:dataout<=8'b10001000; 11:dataout<=8'b10000011; 12:dataout<=8'b11000110; 13:dataout<=8'b10100001; 14:dataout<=8'b10000110; 15:dataout<=8'b10001110; //f endcase end
endmodule
7段数码管静态显示
//本实验就是学习单个数码管的显示
module SMG_LED (clk_50M,led_bit,dataout);
input clk_50M ; //系统时钟50M输入 从12脚输入。 output [7:0] dataout; //我们这里用数码管, output led_bit; //一位数码管的位选择 reg [7:0] dataout; reg led_bit;
always @ ( posedge clk_50M ) begin
led_bit <= 'b0; //是数码管的位选择处于导通状态
dataout<=8'b11000000; //修改7段码,可以显示不同的字符 //本实验初始是在数码管显示0 end
数码管静态显示0到7
//7段数码管测试实验:以动态扫描方式在8位数码管 //“同时”显示0--7
//实验的目的是向用户介绍多个数码管动态显示的方法。
//动态显示的方法是,按一定的频率轮流向各个数码管的COM端送出低电平 //,同时送出对应的数据给各段 module led_0_7 (clk,rst,dataout,en);
input clk,rst; //系统时钟50M输入 从12脚输入。
output[7:0] dataout; //数码管的段码输出
output[7:0] en; //数码管的位选使能输出 reg[7:0] dataout; reg[7:0] en;
reg[15:0] cnt_scan;//扫描频率计数器 reg[4:0] dataout_buf;
always@(posedge clk or negedge rst) begin if(!rst) begin cnt_scan<=0; end else begin cnt_scan<=cnt_scan+1; end end
always @(cnt_scan) begin
case(cnt_scan[15:13]) 3'b000 :
en = 8'b1111_1110; 3'b001 :
en = 8'b1111_1101; 3'b010 :
en = 8'b1111_1011; 3'b011 :
en = 8'b1111_0111; 3'b100 :
en = 8'b1110_1111; 3'b101 :
en = 8'b1101_1111; 3'b110 :
en = 8'b1011_1111; 3'b111 :
en = 8'b0111_1111; default :
en = 8'b1111_1110; endcase end
always@(en) //对应COM信号给出各段数据 begin case(en) 8'b1111_1110: dataout_buf=0; 8'b1111_1101:
dataout_buf=1; 8'b1111_1011: dataout_buf=2; 8'b1111_0111: dataout_buf=3; 8'b1110_1111: dataout_buf=4; 8'b1101_1111: dataout_buf=5; 8'b1011_1111: dataout_buf=6; 8'b0111_1111: dataout_buf=7; default: dataout_buf=8; endcase end
always@(dataout_buf) begin case(dataout_buf) 4'b0000: dataout=8'b1100_0000; 4'b0001: dataout=8'b1111_1001; 4'b0010: dataout=8'b1010_0100; 4'b0011: dataout=8'b1011_0000; 4'b0100: dataout=8'b1001_1001; 4'b0101: dataout=8'b1001_0010; 4'b0110: dataout=8'b1000_0010; 4'b0111: dataout=8'b1111_1000; 4'b1000: dataout=8'b1000_0000; 4'b1001: dataout=8'b1001_1000; 4'b1010: dataout=8'b1000_1000; 4'b1011: dataout=8'b1000_0011;
4'b1100: dataout=8'b1100_0110; 4'b1101: dataout=8'b1010_0001; 4'b1110: dataout=8'b1000_0110; 4'b1111: dataout=8'b1000_1110; endcase end
endmodule
8位优先编码器 //学习编码器的原理
//优先编码器,拨码开关来作为输入,结果由数码管显示 module encode(a,c,en);
input[8:1] a; //由键盘输入数据 output[7:0] c; //结果由数码管显示 reg[7:0] c; output[7:0] en; reg[3:0] c_tmp; integer i; assign en=0; always@(a) begin c_tmp=0; for(i=1;i<9;i=i+1) begin if(a[i]) c_tmp=i; end end
always@(c_tmp) begin
//下面是7段码显示的段码 case(c_tmp) 4'b0000: c=8'b11000000; //0 4'b0001: c=8'b11111001; //1 4'b0010: c=8'b10100100; 4'b0011: c=8'b10110000; 4'b0100: c=8'b10011001;