/* 实验名称:级联计数器 * 程序功能: * 约定俗成:所有需要外部输入的信号加入前缀"In_",所有需往外部输出的信号加入前缀"Out_" */ module mytest(In_clk, In_cin, In_rst_n, Out_cout, Out_q); input In_clk; input In_cin; input In_rst_n; output Out_cout; output[11:0] Out_q; wire Out_line0; // 计数器0的Out_cout端与计数器1的Out_cout端链接 wire Out_line1; // 计数器1的Out_cout端与计数器2的Out_cout端链接 wire[3:0] q0, q1, q2; // 将三组4位信号合并成一组12位的信号 assign Out_q = {q2, q1, q0}; my_Counter Conuter0( .In_clk(In_clk), .In_cin(In_cin), // 重点 .In_rst_n(In_rst_n), .Out_cout(Out_line0), // 重点 //.Out_q(Out_q[3:0]) // 方式1 .Out_q(q0) // 方式2 ); my_Counter Conuter1( .In_clk(In_clk), .In_cin(Out_line0), // 重点 这里来一次高电平意味这计数器0计满 .In_rst_n(In_rst_n), .Out_cout(Out_line1), // 重点 //.Out_q(Out_q[7:4]) // 方式1 .Out_q(q1) // 方式2 ); my_Counter Conuter2( .In_clk(In_clk), .In_cin(Out_line1), // 重点 这里来一次高电平意味这计数器1计满 .In_rst_n(In_rst_n), .Out_cout(Out_cout), // 重点 //.Out_q(Out_q[11:8]) // 方式1 .Out_q(q2) // 方式2 ); endmodule /* 实验名称:计数器 * 程序功能: * 约定俗成:所有需要外部输入的信号加入前缀"In_" * 所有需往外部输出的信号加入前缀"Out_" */ module my_Counter(In_clk, In_cin, In_rst_n, Out_cout, Out_q); input In_clk; input In_cin; input In_rst_n; output reg Out_cout; output [3:0]Out_q; reg[3:0] cnt; // 存储计数值 // 捕获 In_clk 上升沿,捕获 In_rst_n 下降沿 // 计数程序块 always@(posedge In_clk or negedge In_rst_n) if(1'b0 == In_rst_n) // 复位信号处理 计数归零 cnt <= 4'd0; else if(1'b1 == In_cin) // In_cin 为高时开始计数 begin if(4'd9 == cnt) // cnt 等于 9 则归零 cnt <=4'd0; else cnt <= cnt + 1'b1; // cnt 小于 9 则累加 end else ; /* 这段代码会导致在级联的时候每一级 Out_cout 都会延迟一个时钟周期 // 捕获 In_clk 上升沿,捕获 In_rst_n 下降沿 // 溢出输出程序块 always@(posedge In_clk or negedge In_rst_n) if(1'b0 == In_rst_n) // 复位信号处理 计数归零 Out_cout <= 1'b0; else if(1'b1 == In_cin && 4'd9 == cnt) Out_cout <= 1'b1; // In_cin 为高并且同时上个计数器计数到9则输出1 else Out_cout <= 1'b0; // 反之输出0 */ // 修改如下 assign Out_cout = (1'b1 == In_cin && 4'd9 == cnt); assign Out_q = cnt; endmodule |