设计具有异步复位端和同步时钟使能端的60进制计数器cnt60。利用参数的传递作用将底层元件gen_divd输出4Hz方波信号clk_1m,利用例化语句将计数值与底层元件bin2bcd的输入端连接。cnt60模块的输入端有:异步复位端rst_n和同步时钟使能端en,时钟端clk;输出端有:计数值输出mint[7:0]、进位输出COUT
时间: 2024-02-05 11:13:52 浏览: 65
设计方案含异步清零和同步时钟使能的加法计数器.docx
以下是该60进制计数器的Verilog代码:
```verilog
module cnt60 (
input rst_n, // 异步复位端
input en, // 同步时钟使能端
input clk, // 时钟端
output [7:0] mint, // 计数值输出
output COUT // 进位输出
);
reg [5:0] count; // 6 bit 计数器
wire clk_1m; // 4Hz 方波信号
gen_divd #(.DIV(1499)) gen_divd_inst (.clk(clk), .rst_n(rst_n), .clk_1m(clk_1m)); // 60MHz / 1500 = 40kHz
assign mint = {(count[5])? 2'b01 : 2'b00, (count[4:0]/10), (count[3:0]%10)}; // 转换为 BCD 码
assign COUT = (count == 6'd59)? 1'b1 : 1'b0; // 判断是否进位
always @(posedge clk_1m or negedge rst_n) begin
if (!rst_n) // 异步复位
count <= 6'd0;
else if (en) // 同步时钟使能
count <= (count == 6'd59)? 6'd0 : count + 1;
end
endmodule
```
其中,`gen_divd` 是用来产生 4Hz 方波信号的底层元件,其代码如下:
```verilog
module gen_divd (
input clk, // 时钟端
input rst_n, // 异步复位端
output clk_1m // 4Hz 方波信号
);
reg [11:0] count; // 12 bit 计数器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) // 异步复位
count <= 12'd0;
else
count <= (count == 12'd1499)? 12'd0 : count + 1; // 60MHz / 1500 = 40kHz
end
assign clk_1m = (count == 12'd749)? 1'b1 : 1'b0; // 40kHz / 2 / 10 = 2kHz = 4Hz / 60
endmodule
```
在顶层模块中,可以通过实例化 `cnt60` 模块,并将参数 `en` 和 `clk` 与时钟信号连接,将参数 `rst_n` 与异步复位信号连接。另外,将 `mint` 连接到 `bin2bcd` 模块的输入端,将 `COUT` 作为下一个计数器的进位输入。
```verilog
module top (
input rst_n, // 异步复位信号
input clk, // 时钟信号
output [7:0] bcd, // BCD 码输出
output COUT // 进位输出
);
wire clk_1m; // 4Hz 方波信号
cnt60 #(.*(.en(en), .clk(clk))) cnt60_inst (.rst_n(rst_n), .mint(bcd), .COUT(COUT), .clk(clk_1m));
bin2bcd #(.WIDTH(6)) bin2bcd_inst (.bin(bcd), .bcd(bcd));
endmodule
```
阅读全文