要求:1、设计一个数字频率计,闸门时间为1秒,最高可测频率为100Mhz.
2、频率由8位数码管显示输出。
简易数字频率计 verilog语言设计
答案:2 悬赏:20 手机版
解决时间 2021-02-05 08:54
- 提问者网友:兔牙战士
- 2021-02-04 21:21
最佳答案
- 五星知识达人网友:话散在刀尖上
- 2021-02-04 21:37
假设 秒时间高电平为1秒钟。
参考代码如下,
module button( clk, rst, pp1s, disp);
input rst,clk;
input pp1s; //秒时钟基准
output reg [7:0] disp[8:0]; //9个10进制数码管显示。
reg reg [3:0] cnt[8:0]; //9个十进制。
always@(posedge clk_dut or negedge rst)
if(!rst)
begin cnt[0] <= 3'b0; cnt[1] <= 3'b0; ...... cnt[8] <= 3'b0; end
else if (!pp1s)
begin cnt[0] <= 3'b0; cnt[1] <= 3'b0; ...... cnt[8] <= 3'b0; end
else
begin
if (cnt[0] >= 4'h9) cnt[0] <= 4'b0; else cnt[0] <= cnt[0] + 1'b1;
if (cnt[0] >= 4'b9)
begin
if (cnt[1] >= 4'h9) cnt[1] <= 4'b0; else cnt[1] <= cnt[1] + 1'b1;
end
if (cnt[0] >= 4'b9 && cnt[1] >= 4'b9)
begin
if (cnt[2] >= 4'h9) cnt[2] <= 4'b0; else cnt[2] <= cnt[2] + 1'b1;
end
.....
if (cnt[0] >= 4'b9 && cnt[1] >= 4'b9 && cnt[2] >= 4'b9 && cnt[3] >= 4'b9 && cnt[4] >= 4'b9 && cnt[5] >= 4'b9 && cnt[6] >= 4'b9 && cnt[7] >= 4'b9)
begin
if (cnt[8] >= 4'h9) cnt[8] <= 4'b0; else cnt[8] <= cnt[8] + 1'b1;
end
end
//数码管编码
always@(*)
case (cnt[0])
4'h0 disp[0] = 0x3f;
4'h1 disp[0] = 0x06;
4'h2 disp[0] = 0x5b;
4'h3 disp[0] = 0x4f;
4'h4 disp[0] = 0x66;
4'h5 disp[0] = 0x6d;
4'h6 disp[0] = 0x7d;
4'h7 disp[0] = 0x07;
4'h8 disp[0] = 0x7f;
4'h9 disp[0] = 0x6f;
default:disp[0] = 0x3f;
endcase
always@(*)
case (cnt[8])
4'h0 disp[8] = 0x3f;
4'h1 disp[8] = 0x06;
4'h2 disp[8] = 0x5b;
4'h3 disp[8] = 0x4f;
4'h4 disp[8] = 0x66;
4'h5 disp[8] = 0x6d;
4'h6 disp[8] = 0x7d;
4'h7 disp[8] = 0x07;
4'h8 disp[8] = 0x7f;
4'h9 disp[8] = 0x6f;
default:disp[8] = 0x3f;
endcase
endmodule
参考代码如下,
module button( clk, rst, pp1s, disp);
input rst,clk;
input pp1s; //秒时钟基准
output reg [7:0] disp[8:0]; //9个10进制数码管显示。
reg reg [3:0] cnt[8:0]; //9个十进制。
always@(posedge clk_dut or negedge rst)
if(!rst)
begin cnt[0] <= 3'b0; cnt[1] <= 3'b0; ...... cnt[8] <= 3'b0; end
else if (!pp1s)
begin cnt[0] <= 3'b0; cnt[1] <= 3'b0; ...... cnt[8] <= 3'b0; end
else
begin
if (cnt[0] >= 4'h9) cnt[0] <= 4'b0; else cnt[0] <= cnt[0] + 1'b1;
if (cnt[0] >= 4'b9)
begin
if (cnt[1] >= 4'h9) cnt[1] <= 4'b0; else cnt[1] <= cnt[1] + 1'b1;
end
if (cnt[0] >= 4'b9 && cnt[1] >= 4'b9)
begin
if (cnt[2] >= 4'h9) cnt[2] <= 4'b0; else cnt[2] <= cnt[2] + 1'b1;
end
.....
if (cnt[0] >= 4'b9 && cnt[1] >= 4'b9 && cnt[2] >= 4'b9 && cnt[3] >= 4'b9 && cnt[4] >= 4'b9 && cnt[5] >= 4'b9 && cnt[6] >= 4'b9 && cnt[7] >= 4'b9)
begin
if (cnt[8] >= 4'h9) cnt[8] <= 4'b0; else cnt[8] <= cnt[8] + 1'b1;
end
end
//数码管编码
always@(*)
case (cnt[0])
4'h0 disp[0] = 0x3f;
4'h1 disp[0] = 0x06;
4'h2 disp[0] = 0x5b;
4'h3 disp[0] = 0x4f;
4'h4 disp[0] = 0x66;
4'h5 disp[0] = 0x6d;
4'h6 disp[0] = 0x7d;
4'h7 disp[0] = 0x07;
4'h8 disp[0] = 0x7f;
4'h9 disp[0] = 0x6f;
default:disp[0] = 0x3f;
endcase
always@(*)
case (cnt[8])
4'h0 disp[8] = 0x3f;
4'h1 disp[8] = 0x06;
4'h2 disp[8] = 0x5b;
4'h3 disp[8] = 0x4f;
4'h4 disp[8] = 0x66;
4'h5 disp[8] = 0x6d;
4'h6 disp[8] = 0x7d;
4'h7 disp[8] = 0x07;
4'h8 disp[8] = 0x7f;
4'h9 disp[8] = 0x6f;
default:disp[8] = 0x3f;
endcase
endmodule
全部回答
- 1楼网友:想偏头吻你
- 2021-02-04 22:28
等精度频率计,最高测到50mhz.但精度不高,结果送到数码管上显示.我不明白led怎么显示,谁也没时间现给你做一个你的要求,自己改吧.尽力了 module pinlvji(clk,clk_test,rst,out_wei,out_duan); input clk,rst; output [1:0]out_wei; output [7:0]out_duan; output clk_test; reg [1:0]out_wei; reg [7:0]out_duan=8'b00000011; //a b c d e f g dp reg clk_test=0; // ce shi xin hao reg [1:0] count1=2'b00; reg [24:0] count2=0; reg [18:0] count3=0; reg [5:0] show; //largest 50m reg [3:0] shi; reg [3:0] ge; reg flag=0; //yes or not get to one second reg [19:0] saomiao; reg [7:0] h; reg [7:0] l; always@(posedge clk) begin //creat a test signal 'clk_test' if(count1==2'b11) begin // 50/8m count1<=2'b00; clk_test<=~clk_test; end else count1<=count1+1; end always@(posedge clk or negedge rst) begin //wait for 1 second ,then flag=1 if(!rst) count2<=0; else begin if(!flag) count2<=count2+1; if(count2==25000000) begin // 1 second flag<=1; end end end always@(posedge clk_test or negedge rst) begin //ji shu qi (1) if(!rst) count3<=0; else if(!flag) begin count3<=count3+1; if(count3==500000) begin //1m count3<=0; show<=show+1; end end end always@(posedge clk) begin //scan saomiao<=saomiao+1'b1; if(!rst) begin case(saomiao) 1 :begin out_wei<=2'b10; out_duan<=8'b00000011; //0 end 300000:begin out_wei<=2'b01; out_duan<=8'b00000011; //0 end 600000:saomiao<=0; endcase end else begin case(saomiao) 1 :begin out_wei<=2'b10; if(flag) out_duan<=l; end 300000:begin out_wei<=2'b01; if(flag) out_duan<=h; end 600000:saomiao<=0; endcase end end always@(posedge clk) begin case(shi) 0:h=8'b00000011; 1:h=8'b100
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯