设计具有异步复位端和同步时钟使能端的60进制计数器cnt60。利用参数的传递作用将底层元件gen_divd输出4Hz方波信号clk_1m,利用例化语句将计数值与底层元件bin2bcd的输入端连接。cnt60模块的输入端有:异步复位端rst_n和同步时钟使能端en,时钟端clk;输出端有:计数值输出mint[7:0]、进位输出COUT。 1. 新建工程cnt60.qpf,新建文本文件,输入利用参数的传递作用和例化语句完成的60进制计数器的程序cnt60.v,保存并编译。
时间: 2024-02-05 16:11:58 浏览: 160
以下是设计好的cnt60模块的Verilog代码:
```
module cnt60 #(parameter CLK_DIV = 500000) (
input wire rst_n, // 异步复位端
input wire en, // 同步时钟使能端
input wire clk, // 时钟端
output reg [7:0] mint, // 计数值输出
output reg COUT // 进位输出
);
wire clk_1m;
wire [3:0] divd;
// 底层元件gen_divd的例化
gen_divd #(.CLK_DIV(CLK_DIV)) divd_inst (
.clk(clk),
.rst_n(rst_n),
.clk_divd(clk_1m),
.divd(divd)
);
reg [5:0] cnt; // 计数器
wire [3:0] bin; // 二进制计数器
// cnt60模块的主要逻辑
always @(posedge clk_1m or negedge rst_n) begin
if (~rst_n) begin
cnt <= 0;
mint <= 8'h0;
COUT <= 1'b0;
end
else if (en) begin
// 计数器加1
cnt <= cnt + 1;
if (cnt == 60) begin
cnt <= 0;
COUT <= 1'b1;
end
else begin
COUT <= 1'b0;
end
// 将十进制计数器的值转化为BCD码
case (cnt)
6'd0: mint <= 8'h00;
6'd1: mint <= 8'h01;
6'd2: mint <= 8'h02;
6'd3: mint <= 8'h03;
6'd4: mint <= 8'h04;
6'd5: mint <= 8'h05;
6'd6: mint <= 8'h06;
6'd7: mint <= 8'h07;
6'd8: mint <= 8'h08;
6'd9: mint <= 8'h09;
6'd10: mint <= 8'h10;
6'd11: mint <= 8'h11;
6'd12: mint <= 8'h12;
6'd13: mint <= 8'h13;
6'd14: mint <= 8'h14;
6'd15: mint <= 8'h15;
6'd16: mint <= 8'h16;
6'd17: mint <= 8'h17;
6'd18: mint <= 8'h18;
6'd19: mint <= 8'h19;
6'd20: mint <= 8'h20;
6'd21: mint <= 8'h21;
6'd22: mint <= 8'h22;
6'd23: mint <= 8'h23;
6'd24: mint <= 8'h24;
6'd25: mint <= 8'h25;
6'd26: mint <= 8'h26;
6'd27: mint <= 8'h27;
6'd28: mint <= 8'h28;
6'd29: mint <= 8'h29;
6'd30: mint <= 8'h30;
6'd31: mint <= 8'h31;
6'd32: mint <= 8'h32;
6'd33: mint <= 8'h33;
6'd34: mint <= 8'h34;
6'd35: mint <= 8'h35;
6'd36: mint <= 8'h36;
6'd37: mint <= 8'h37;
6'd38: mint <= 8'h38;
6'd39: mint <= 8'h39;
6'd40: mint <= 8'h40;
6'd41: mint <= 8'h41;
6'd42: mint <= 8'h42;
6'd43: mint <= 8'h43;
6'd44: mint <= 8'h44;
6'd45: mint <= 8'h45;
6'd46: mint <= 8'h46;
6'd47: mint <= 8'h47;
6'd48: mint <= 8'h48;
6'd49: mint <= 8'h49;
6'd50: mint <= 8'h50;
6'd51: mint <= 8'h51;
6'd52: mint <= 8'h52;
6'd53: mint <= 8'h53;
6'd54: mint <= 8'h54;
6'd55: mint <= 8'h55;
6'd56: mint <= 8'h56;
6'd57: mint <= 8'h57;
6'd58: mint <= 8'h58;
6'd59: mint <= 8'h59;
endcase
end
end
// 将二进制计数器的值传递给底层元件bin2bcd
bin2bcd bcd_inst (
.bin(bin),
.bcd(mint[7:4])
);
endmodule
// 底层元件gen_divd的定义
module gen_divd #(parameter CLK_DIV = 500000) (
input wire clk, // 时钟端
input wire rst_n, // 异步复位端
output wire clk_divd, // 输出方波信号
output wire [3:0] divd // 输出分频器计数值
);
reg [22:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
cnt <= 0;
clk_divd <= 1'b0;
end
else begin
cnt <= cnt + 1;
if (cnt == CLK_DIV - 1) begin
cnt <= 0;
clk_divd <= ~clk_divd;
end
end
end
// 分频器的计数值
assign divd = {1'b0, clk_divd};
endmodule
// 底层元件bin2bcd的定义
module bin2bcd (
input wire [3:0] bin, // 二进制计数器的值
output reg [3:0] bcd // BCD码输出
);
always @* begin
case (bin)
4'b0000: bcd = 4'b0000;
4'b0001: bcd = 4'b0001;
4'b0010: bcd = 4'b0010;
4'b0011: bcd = 4'b0011;
4'b0100: bcd = 4'b0100;
4'b0101: bcd = 4'b0101;
4'b0110: bcd = 4'b0110;
4'b0111: bcd = 4'b0111;
4'b1000: bcd = 4'b1000;
4'b1001: bcd = 4'b1001;
4'b1010: bcd = 4'b0001;
4'b1011: bcd = 4'b0010;
4'b1100: bcd = 4'b0011;
4'b1101: bcd = 4'b0100;
4'b1110: bcd = 4'b0101;
4'b1111: bcd = 4'b0110;
endcase
end
endmodule
```
在该代码中,我们首先实例化了一个底层元件 `gen_divd`,该元件能够通过将输入时钟信号分频来输出一个低频方波信号。我们将该方波信号作为计数器的时钟信号 `clk_1m`。
然后,我们定义了一个计数器变量 `cnt`,以及一个二进制计数器变量 `bin`。在每个时钟周期上升沿到来时,我们首先判断是否需要进行异步复位操作,如果需要,则将计数器清零,并将输出的计数值和进位信号都置为0;否则,如果同步时钟使能端 `en` 为高电平,则将计数器加1,并根据计数器的值将输出的计数值 `mint` 转化为BCD码,并判断是否需要产生进位信号 `COUT`。最后,我们将二进制计数器的值传递给底层元件 `bin2bcd`,该元件将二进制计数器的值转化为BCD码,从而可以将计数值输出到8位LED数码管等外设上。
在实例化计数器模块时,我们可以通过参数 `CLK_DIV` 来控制计数器的时钟频率,也就是将输入时钟信号分频的比例。这样,我们就可以根据自己的实际需求来调整计数器模块的工作频率。
阅读全文
相关推荐














