一、工程目的
根据频率的定义和频率测量的基本原理。测定信号的频率必须有一个脉宽为1秒的输入信号脉冲计数允许的信号;1秒计数结束后,计数值被锁入锁存器,计数器清零,为下一测频计数周期作好准备
二、设备及软件环境:
软件需求:Quartus
硬件需求:
微型计算机
设计思路:
因为要测
1s
的频率,所以首先要产生一个
1s
的时钟
always@(posedge clk)//产生1s信号clkkbegin if(clkk_count==32'd24_999_999) begin clkk <= ~clkk; clkk_count <= 0; end else begin clkk_count <= clkk_count+1'b1; endend
接下来做一个类似这样的程序100khz,10khz,1khz的输入
always@(posedge clk)//100khz fin
begin
if(fin_count==32'd249)
begin
fin=~fin;
fin_count <= 0;
end
else
fin_count <= fin_count+1'b1;
end
产生一个如原理图所示的ftctrl的模块,由于读和写不能同时进行,所以取取反操作
always@(posedge clkk) //ftctrl
begin
cnt_en <= ~cnt_en;
load <= ~load;
end
如果
clkk=0,en=0,load=0
说明在进行读寄存器中的数的读操作,所以这时候可以将
counter
中的数进行清
0
操作
always@(clkk,cnt_en,load)
begin
if(clkk==0&&cnt_en==0&&load==1)
begin
rst_cnt <= 1;
end
else
begin
rst_cnt <= 0;
end
end
定义counter操作,如果rst为1,计数器从头开始,否则加1
always@(posedge rst_cnt or posedge fin)//counter
begin
if(rst_cnt)
begin
counter <= 0;
end
else if(cnt_en)
begin
counter <= counter+1'b1;
end
end
此时是读寄存器中的值
always@(posedge load)
begin
count_reg <= counter;
end
整体代码:
顶层代码:
module pinglv(clk,hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7);
input clk;
output [6:0]hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7;
reg clkk,fin;
reg [31:0]clkk_count;
reg [31:0]fin_count;
reg [31:0]counter;
reg [31:0]count_reg;
reg load=1,rst_cnt=0,cnt_en=0;
always@(posedge clk)//产生1s信号clkk
begin
if(clkk_count==32'd24_999_999)
begin
clkk <= ~clkk;
clkk_count <= 0;
end
else
begin
clkk_count <= clkk_count+1'b1;
end
end
//always@(posedge clk)//1khz fin
//begin
// if(fin_count==32'd25_000)
// begin
// fin=~fin;
// fin_count <= 0;
// end
// else
// fin_count <= fin_count+1'b1;
//end
//always@(posedge clk)//10khz fin
//begin
// if(fin_count==32'd2_499)
// begin
// fin=~fin;
// fin_count <= 0;
// end
// else
// fin_count <= fin_count+1'b1;
//end
always@(posedge clk)//100khz fin
begin
if(fin_count==32'd249)
begin
fin=~fin;
fin_count <= 0;
end
else
fin_count <= fin_count+1'b1;
end
always@(posedge clkk) //ftctrl
begin
cnt_en <= ~cnt_en;
load <= ~load;
end
always@(clkk,cnt_en,load)
begin
if(clkk==0&&cnt_en==0&&load==1)
begin
rst_cnt <= 1;
end
else
begin
rst_cnt <= 0;
end
end
always@(posedge rst_cnt or posedge fin)//counter
begin
if(rst_cnt)
begin
counter <= 0;
end
else if(cnt_en)
begin
counter <= counter+1'b1;
end
end
always@(posedge load)
begin
count_reg <= counter;
end
hex u0(count_reg[3:0],hex0);
hex u1(count_reg[7:4],hex1);
hex u2(count_reg[11:8],hex2);
hex u3(count_reg[15:12],hex3);
hex u4(count_reg[19:16],hex4);
hex u5(count_reg[23:20],hex5);
hex u6(count_reg[27:24],hex6);
hex u7(count_reg[31:28],hex7);
endmodule
底层代码
module hex(A,LED7S);
input[3:0]A;
output[6:0]LED7S;
reg[6:0]LED7S;
always @(A)
begin
case(A)
4'd0:LED7S=7'b1000000;
4'd1:LED7S=7'b1111001;
4'd2:LED7S=7'b0100100;
4'd3:LED7S=7'b0110000;
4'd4:LED7S=7'b0011001;
4'd5:LED7S=7'b0010010;
4'd6:LED7S=7'b0000010;
4'd7:LED7S=7'b1111000;
4'd8:LED7S=7'b0000000;
4'd9:LED7S=7'b0010000;
4'd10:LED7S=7'b0001000;
4'd11:LED7S=7'b0000011;
4'd12:LED7S=7'b1000110;
4'd13:LED7S=7'b0100001;
4'd14:LED7S=7'b0000110;
4'd15:LED7S=7'b0001110;
default:LED7S=7'b1000000;
endcase
end
endmodule
工程文件下载地址:
点击打开链接