| 
 | 
 本帖最后由 lcytms 于 2016-11-10 09:23 编辑  
 
新建改进的任意分频模块divider2.v。 
将改进的任意分频模块divider2.v设置为顶层模块。 
将原有的显式建模方式改为隐式建模方式,原有生成out_clk_2时采用~clk作为时钟,现在改用negedge clk触发。 
同步由原来的复位信号同步,改为cnt计数器同步。 
这样避免了原有的长时间运行后同步出错可能性。 
改进的任意分频模块divider2.v代码如下。 
module divider2 (clk, rst_n, clk_out); 
 
        input clk, rst_n; 
         
        output clk_out; 
 
        parameter WIDTH = 3;                        // WIDTH = 3 
 
        wire [25:0] HW, LW; 
         
        assign HW = WIDTH>>1; 
        assign LW = (WIDTH+1)>>1; 
         
        reg out_clk_1, out_clk_2; 
                                         
        reg state1, state2; 
         
        localparam        s0 = 1'b0, 
                                        s1 = 1'b1; 
                                         
        reg [25:0] cnt; 
 
        always @ (posedge clk or negedge rst_n) 
                begin 
                        if (!rst_n) 
                                begin 
                                        cnt <= 0; 
                                        out_clk_1 <= 1; 
                                        state1 <= s0; 
                                end 
                        else 
                                begin 
                                        case (state1) 
                                        s0        :        begin                                        // HW part 
                                                                if (cnt < HW - 1) 
                                                                        begin 
                                                                                cnt <= cnt + 26'b1; 
                                                                                out_clk_1 <= 1; 
                                                                                state1 <= s0; 
                                                                        end 
                                                                else 
                                                                        begin 
                                                                                cnt <= 0; 
                                                                                out_clk_1 <= 1; 
                                                                                state1 <= s1; 
                                                                        end 
                                                        end 
                                         
                                        s1        :        begin                                        // LW part 
                                                                if (cnt < LW - 1) 
                                                                        begin 
                                                                                cnt <= cnt + 26'b1; 
                                                                                out_clk_1 <= 0; 
                                                                                state1 <= s1; 
                                                                        end 
                                                                else 
                                                                        begin 
                                                                                cnt <= 0; 
                                                                                out_clk_1 <= 0; 
                                                                                state1 <= s0; 
                                                                        end 
                                                        end 
                                         
                                        default        :        state1 <= s0; 
                                         
                                        endcase 
                                end 
                end 
 
        always @ (negedge clk or negedge rst_n) 
                begin 
                        if (!rst_n) 
                                begin 
                                        out_clk_2 <= 1; 
                                        state2 <= s0; 
                                end 
                        else 
                                begin 
                                        case (state2) 
                                        s0        :        begin                                        // HW part 
                                                                if (cnt < HW - 1) 
                                                                        begin 
                                                                                out_clk_2 <= 1; 
                                                                                state2 <= s0; 
                                                                        end 
                                                                else 
                                                                        begin 
                                                                                out_clk_2 <= 1; 
                                                                                state2 <= s1; 
                                                                        end 
                                                        end 
                                         
                                        s1        :        begin                                        // LW part 
                                                                if (cnt < LW - 1) 
                                                                        begin 
                                                                                out_clk_2 <= 0; 
                                                                                state2 <= s1; 
                                                                        end 
                                                                else 
                                                                        begin 
                                                                                out_clk_2 <= 0; 
                                                                                state2 <= s0; 
                                                                        end 
                                                        end 
                                         
                                        default        :        state2 <= s0; 
                                         
                                        endcase 
                                end 
                end 
 
        assign clk_out = (WIDTH & 1'b1) ? (out_clk_1 || out_clk_2) : out_clk_1; 
                 
endmodule 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册 
 
 
 
x
 
 
 
 
 |