module freqtest(clock,freq_input,dig,seg,test);
input clock; //系统时钟
input freq_input; //被测信号输入
output[7:0] dig; //数码管选择输出引脚
output[7:0] seg; //数码管段输出引脚
output[9:0] test; //输出频率信号,用于测试
reg [25:0] counter; //时钟分频计数器
reg [31:0] freq_result; //频率测量结果寄存器
wire [31:0] pre_freq; //脉冲计数寄存器
reg rst;
wire divide_clk; //1Hz 闸门信号
wire clk_scan; //数码管扫描显示时钟
wire cout1,cout2,cout3,cout4,cout5,cout6,cout7;
assign clk_scan = counter[15]; //动态扫描时钟
assign test= counter[9:0]; //输出频率信号,用于测试
//时钟分频进程:分出 1Hz 基准信号
always @(posedge clock)
begin
if (divide_clk)
counter <= 26'd0;
else
counter <= counter + 1'b1;
end
assign divide_clk = (counter >= 26'd50000000);
//锁存测量值进程
always @(posedge clock)
begin
if(divide_clk)
freq_result <= pre_freq;
end
//产生计数器复位信号
always @(posedge clock)
begin
if(divide_clk)
rst <= 1'b1;
else
rst <= 1'b0;
end
//8 位十进制计数模块:由 8 个十进制计数模块构成
cnt10 u1(.clock(clock0),.rst(rst),.cin(1'b1),.cout(cout1),.dout(pre_freq[3:0]));
cnt10 u2(.clock(clock0),.rst(rst),.cin(cout1),.cout(cout2),.dout(pre_freq[7:4]));
cnt10 u3(.clock(clock0),.rst(rst),.cin(cout2),.cout(cout3),.dout(pre_freq[11:8]));
cnt10 u4(.clock(clock0),.rst(rst),.cin(cout3),.cout(cout4),.dout(pre_freq[15:12]));
cnt10 u5(.clock(clock0),.rst(rst),.cin(cout4),.cout(cout5),.dout(pre_freq[19:16]));
cnt10 u6(.clock(clock0),.rst(rst),.cin(cout5),.cout(cout6),.dout(pre_freq[23:20]));
cnt10 u7(.clock(clock0),.rst(rst),.cin(cout6),.cout(cout7),.dout(pre_freq[27:24]));
cnt10 u8(.clock(clock0),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28]));
//数码管显示模块
scan_led u9(.clk_1k(clk_scan),.d(freq_result),.dig(dig),.seg(seg));
endmodule
module cnt10(clock,rst,cin,cout,dout); //10 进制计数器
input clock; //计数时钟
input cin; //进位输入
input rst; //复位信号
output cout; //进位输出
output[3:0] dout; //计数输出
reg[3:0] counter; //寄存器
assign dout = counter;
assign cout = cin && (counter >= 4'd9); //进位输出
always @(posedge clock or posedge rst)
begin
if(rst)
counter <= 4'd0; //计数器复位
else if(cin) //进位输入
begin
if(cout)
counter <= 4'd0;
else
counter <= counter + 1'b1;
end
end
endmodule
module scan_led(clk_1k,d,dig,seg);
input clk_1k;
input [31:0] d; //输入要显示的数据
output [7:0] dig; //数码管选择输出引脚
output [7:0] seg; //数码管段输出引脚
reg [7:0] seg_r; //定义数码管输出寄存器
reg [7:0] dig_r; //定义数码管选择输出寄存器
reg [3:0] disp_dat; //定义显示数据寄存器
reg [2:0] count; //定义计数寄存器
assign dig=dig_r; //输出数码管选择
assign seg=seg_r; //输出数码管译码结果
always @(posedge clk_1k) //定义上升沿触发进程
begin
count <=count+1'b1;
end
always @(posedge clk_1k)
begin
if(d<10)
begin
case(count) //选择扫描显示数据
3'd0:disp_dat=d[31:28]; //第一个数码管
3'd1:disp_dat=d[27:24]; //第二个数码管
3'd2:disp_dat=d[23:20]; //第三个数码管
3'd3:disp_dat=d[19:16]; //第四个数码管
3'd4:disp_dat=d[15:12]; //第五个数码管
3'd5:disp_dat=d[11:8]; //第六个数码管
3'd6:disp_dat=d[7:4]; //第七个数码管
3'd7:disp_dat=d[3:0]; //第八个数码管
endcase
case(count) //选择数码管显示位
3'd0:dig_r=8'b11111111; //选择第一个数码管显示
3'd1:dig_r=8'b11111111; //选择第二个数码管显示
3'd2:dig_r=8'b11111111; //选择第三个数码管显示
3'd3:dig_r=8'b11111111; //选择第四个数码管显示
3'd4:dig_r=8'b11111111; //选择第五个数码管显示
3'd5:dig_r=8'b11111111; //选择第六个数码管显示
3'd6:dig_r=8'b11111111; //选择第七个数码管显示
3'd7:dig_r=8'b11111110; //选择第八个数码管显示
endcase
end
if(d>10&d<100)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b11111111;
3'd2:dig_r=8'b11111111;
3'd3:dig_r=8'b11111111;
3'd4:dig_r=8'b11111111;
3'd5:dig_r=8'b11111111;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>100&d<1000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b11111111;
3'd2:dig_r=8'b11111111;
3'd3:dig_r=8'b11111111;
3'd4:dig_r=8'b11111111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>1000&d<10000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b11111111;
3'd2:dig_r=8'b11111111;
3'd3:dig_r=8'b11111111;
3'd4:dig_r=8'b11110111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>10000&d<100000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b11111111;
3'd2:dig_r=8'b11111111;
3'd3:dig_r=8'b11101111;
3'd4:dig_r=8'b11110111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>100000&d<1000000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b11111111;
3'd2:dig_r=8'b11011111;
3'd3:dig_r=8'b11101111;
3'd4:dig_r=8'b11110111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>100000&d<1000000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b11111111;
3'd1:dig_r=8'b10111111;
3'd2:dig_r=8'b11011111;
3'd3:dig_r=8'b11101111;
3'd4:dig_r=8'b11110111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
if(d>10000000)
begin
case(count)
3'd0:disp_dat=d[31:28];
3'd1:disp_dat=d[27:24];
3'd2:disp_dat=d[23:20];
3'd3:disp_dat=d[19:16];
3'd4:disp_dat=d[15:12];
3'd5:disp_dat=d[11:8];
3'd6:disp_dat=d[7:4];
3'd7:disp_dat=d[3:0];
endcase
case(count)
3'd0:dig_r=8'b01111111;
3'd1:dig_r=8'b10111111;
3'd2:dig_r=8'b11011111;
3'd3:dig_r=8'b11101111;
3'd4:dig_r=8'b11110111;
3'd5:dig_r=8'b11111011;
3'd6:dig_r=8'b11111101;
3'd7:dig_r=8'b11111110;
endcase
end
end
always @(disp_dat)
begin
case(disp_dat) //七段译码
4'h0:seg_r=8'hc0; //显示0
4'h1:seg_r=8'hf9; //显示1
4'h2:seg_r=8'ha4; //显示2
4'h3:seg_r=8'hb0; //显示3
4'h4:seg_r=8'h99; //显示4
4'h5:seg_r=8'h92; //显示5
4'h6:seg_r=8'h82; //显示6
4'h7:seg_r=8'hf8; //显示7
4'h8:seg_r=8'h80; //显示8
4'h9:seg_r=8'h90; //显示9
4'ha:seg_r=8'h88; //显示a
4'hb:seg_r=8'h83; //显示b
4'hc:seg_r=8'hc6; //显示c
4'hd:seg_r=8'ha1; //显示d
4'he:seg_r=8'h86; //显示e
4'hf:seg_r=8'h8e; //显示f
endcase
end
endmodule
一周热门 更多>