/* 實驗名稱:級聯計數器 * 程序功能: * 約定俗成:所有需要外部輸入的信號加入前綴"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 |