1.请设计一个50进制的加法计数器(从00计到49),每1 秒加一次,用两个数码管显示计数结果,进行程序设计、软件编译、仿真分析、硬件测试。
2.请设计一个24进制的减法计数器(从24计到00),每2 秒减一次,用两个数码管显示计数结果,给出程序设计、软件编译、仿真分析、硬件测试及详细实验过程
用verilog HDL语法编写
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 老皮芽子 2022-10-27 18:14关注
两部分代码有不少共用模块
1Hz 分频
0-23 计数
0-49 计数
7段LED数码管译码
top_led_50
led_cnt50_sim 测试激励代码
top_led_24
led_cnt24_sim 测试激励代码module clk_fp # ( parameter CLK_IN_FREQ = 50*1000*1000 //50MHz ) ( input clk, output clk1s, //1Hz output clk2s //0.5Hz ); reg clk1 = 0; reg clk2 = 0; reg [31:0] cnt=0; assign clk1s = clk1; assign clk2s = clk2; always @(posedge clk) begin if(cnt < CLK_IN_FREQ-1) cnt <= cnt + 1; else cnt <= 0; end always @(posedge clk) begin if(cnt == CLK_IN_FREQ/2-1||cnt == CLK_IN_FREQ-1) clk1 <= !clk1; else clk1 <= 0; end always @(posedge clk) begin if(cnt == CLK_IN_FREQ-1) clk2 <= !clk2; else clk2 <= 0; end endmodule
module cnt_24 //0-23 同步计数器,异步清零 ( input clk, input rst_n, output [7:0] dat ); reg [7:0] cnt = 0; assign dat = cnt; always @(posedge clk or negedge rst_n) //rst_n 异步复位 begin if( rst_n == 0 ) cnt <= 0; else if(cnt < 23) cnt <= cnt + 1; else cnt <= 0; end endmodule
module cnt_50 //0-49 同步计数器,异步清零 ( input clk, input rst_n, output [7:0] dat ); reg [7:0] cnt = 0; assign dat = cnt; always @(posedge clk or negedge rst_n) //rst_n 异步复位 begin if( rst_n == 0 ) cnt <= 0; else if(cnt < 49) cnt <= cnt + 1; else cnt <= 0; end endmodule
module led_7s //led 7 段数码管译码 0-F ( input [3:0] dat, output reg [6:0] led7s //{a,b,c,d,e,f,g} //7段LED 排列 a->led7s[6] g->led7s[0] ); always@(*) begin case(dat) 4'b0000:led7s=7'b0111111; //0 4'b0001:led7s=7'b0000110; //1 4'b0010:led7s=7'b1011011; //2 4'b0011:led7s=7'b1001111; //3 4'b0100:led7s=7'b1100110; //4 4'b0101:led7s=7'b1101101; //5 4'b0110:led7s=7'b1111101; //6 4'b0111:led7s=7'b0000111; //7 4'b1000:led7s=7'b1111111; //8 4'b1001:led7s=7'b1101111; //9 4'b1010:led7s=7'b1110111; //A 4'b1011:led7s=7'b1111100; //B 4'b1100:led7s=7'b0111001; //C 4'b1101:led7s=7'b1011110; //D 4'b1110:led7s=7'b1111001; //E 4'b1111:led7s=7'b1110001; //F endcase end endmodule
module top_led_50 ( input clk, input rst_n, output [6:0] led7s_a, //个位 output [6:0] led7s_b //十位 ); wire clk1s; wire clk2s; wire [7:0] cnts; wire [3:0] gw_dat; wire [3:0] sw_dat; clk_fp u1 ( .clk (clk), //输入 50MHz .clk1s (clk1s), //输出 1Hz .clk2s (clk2s) //维护处 0.5Hz ); cnt_50 u2 //0-49 同步计数器,异步清零 ( .clk (clk1s), .rst_n (rst_n), .dat (cnts) ); assign gw_dat = cnts%10; assign sw_dat = cnts/10; led_7s ua //个位 ( .dat (gw_dat), .led7s (led7s_a) ); led_7s ub //十位位 ( .dat (sw_dat), .led7s (led7s_b) ); endmodule
module led_cnt50_sim(); reg clk; reg rst_n; initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end always #20 clk = ~clk; //50MHz wire [6:0] led7s_a; //个位 wire [6:0] led7s_b; //十位 top_led_50 u1 ( .clk (clk), .rst_n (rst_n), .led7s_a (led7s_a), .led7s_b (led7s_b) ); endmodule
module top_led_24 ( input clk, input rst_n, output [6:0] led7s_a, //个位 output [6:0] led7s_b //十位 ); wire clk1s; wire clk2s; wire [7:0] cnts; wire [3:0] gw_dat; wire [3:0] sw_dat; clk_fp u1 ( .clk (clk), //输入 50MHz .clk1s (clk1s), //输出 1Hz .clk2s (clk2s) //维护处 0.5Hz ); cnt_24 u2 //0-49 同步计数器,异步清零 ( .clk (clk2s), .rst_n (rst_n), .dat (cnts) ); assign gw_dat = cnts%10; assign sw_dat = cnts/10; led_7s ua //个位 ( .dat (gw_dat), .led7s (led7s_a) ); led_7s ub //十位位 ( .dat (sw_dat), .led7s (led7s_b) ); endmodule
`timescale 1ns / 1ns module led_cnt24_sim(); reg clk; reg rst_n; initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end always #20 clk = ~clk; //50MHz wire [6:0] led7s_a; //个位 wire [6:0] led7s_b; //十位 top_led_24 u1 ( .clk (clk), .rst_n (rst_n), .led7s_a (led7s_a), .led7s_b (led7s_b) ); endmodule
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条