level 4
各位吧友,帮忙看一下,怎么改成频率显示间隔2s。
module FREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNAL_TEST,RESET);
output GATED_CLK;
output LOAD;
output COUNTER_CLR;
input CLK_IN;
input SIGNAL_TEST;
input RESET;
reg LOAD;
reg COUNTER_CLR;
reg DIVIDE_CLK;
reg[19:0] cn;
reg A1,A2;
//信号分频:由CLK_IN得到分频后的信号DIVIDE_CLK(0.5Hz)
always@(posedge CLK_IN)
begin
if(RESET)
begin
DIVIDE_CLK<=0;
cn<=0;
end
else if(cn==1000000)
begin
cn<=0;
DIVIDE_CLK<=~DIVIDE_CLK;
end
else
cn<=cn+1;
end
//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号
always @(posedge SIGNAL_TEST)
begin
A1<=~DIVIDE_CLK;
end
always @(posedge SIGNAL_TEST)
begin
A2=A1;
end
always @(A1 or A2)
begin
LOAD=A1&&(!A2);
end
always @(posedge SIGNAL_TEST)
COUNTER_CLR=LOAD;
//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号
assignGATED_CLK=SIGNAL_TEST&DIVIDE_CLK;
endmodule
(2)、计数器模块:
moduleFREQUENCY_COUNTER_BLOCK(COUT,FLOW_UP,CLOCK_IN,RESET,LOAD,COUNTER_CLR);
output[15:0] COUT;
output FLOW_UP;
input CLOCK_IN;
input LOAD;
input COUNTER_CLR;
input RESET;
reg[15:0] TEMP;
reg FLOW_UP;
parameter B_SIZE=16; //二进制位宽,为便于移植,所有定义了成参数
reg[B_SIZE
+3
:0] bcd; //转换后的BCD码的位数要比二进制多4位
reg[B_SIZE-1:0] binary;
reg[B_SIZE-1:0] bin;
reg[B_SIZE+3:0] result;
//计数器完成计数得到二进制表示的频率数值
always @(CLOCK_IN or RESET or LOAD orCOUNTER_CLR)
begin
if(RESET|COUNTER_CLR)
begin
TEMP<=0;
FLOW_UP<=0;
end
else if(LOAD)
binary<=TEMP;
else if(TEMP>9999)
begin
FLOW_UP<=1;
binary<=9999;
end
else
if(CLOCK_IN)
TEMP<=TEMP+1;
end
//将二进制表示(或十六进制表示)的数转换为BCD码的形式,便于数码管译码显示
always @(binary or RESET)
begin
bin=binary;
result=0;
if(RESET)
bcd<=0;
else
begin
repeat(B_SIZE-1)
begin
result[0]=bin[B_SIZE-1];
if(result[3:0]>4)
result[3:0]=result[3:0]+4'd3;
if(result[7:4]>4)
result[7:4]=result[7:4]+4'd3;
if(result[11:8]>4)
result[11:8]=result[11:8]+4'd3;
if(result[15:12]>4)
result[15:12]=result[15:12]+4'd3;
if(result[19:16]>4)
result[19:16]=result[19:16]+4'd3;
result=result<<1;
bin=bin<<1;
end
result[0]=bin[B_SIZE-1];
bcd<=result;
end
end
assign COUT=bcd[15:0];
endmodule
(3)信号显示处理:
moduleFREQUENCY_DISPLY_BLOCK(DOUT,DCLK_IN,RESET,CDIN);
output[10:0] DOUT;
input[15:0] CDIN;
input DCLK_IN;
input RESET;
reg[10:0] DOUT;
reg[3:0] Temp1;
reg[1:0] cn;
always @(posedge DCLK_IN) //设置成动态扫描
begin
if(RESET)
cn<=0;
else
begin
cn<=cn+1;
case(cn)
2'b00:begin DOUT[10:7]<=4'b0001; Temp1<=CDIN[3:0];end
2'b01:begin DOUT[10:7]<=4'b0010; Temp1<=CDIN[7:4];end
2'b10:begin DOUT[10:7]<=4'b0100; Temp1<=CDIN[11:8];end
2'b11:begin DOUT[10:7]<=4'b1000; Temp1<=CDIN[15:12];end
endcase
end
end
always @(Temp1) //译码显示
begin
case(Temp1)
4'b0000:DOUT[6:0]<=7'b0111111; //3fh=0
4'b0001:DOUT[6:0]<=7'b0000110; //06h=1
4'b0010:DOUT[6:0]<=7'b1010110; //56h=2
4'b0011:DOUT[6:0]<=7'b1001111; //4fh=3
4'b0100:DOUT[6:0]<=7'b1100110; //66h=4
4'b0101:DOUT[6:0]<=7'b1101101; //6dh=5
4'b0110:DOUT[6:0]<=7'b1111101; //7dh=6
4'b0111:DOUT[6:0]<=7'b0000111; //07h=7
4'b1000:DOUT[6:0]<=7'b1111111; //7fh=8
4'b1001:DOUT[6:0]<=7'b1101111; //6fh=9
default:DOUT[6:0]<=7'b0111111; //3fh
endcase
end
endmodule
顶层verilog程序:
moduleFREQUENCY_COUNTER_DISPLY_BLOCK(DOUT,FLOW_UP,CLK,TEST_CLK_IN,RESET);
output[10:0] DOUT;
output FLOW_UP;
input CLK;
input TEST_CLK_IN;
input RESET;
wire gated_clk,load,counter_clr;
wire[15:0] cout_cdin;
2014年12月24日 06点12分
4