CỘNG ĐỒNG VI MẠCH BÁN DẪN VIỆT NAM – CÔNG TY VSRD

DIENTU.VN & DIENTUVIETNAM.VN Tập trung nghiên cứu và phát triển Semiconductor, từ thiết kế vi mạch đến ứng dụng thực tế.

Chuyên sâu Lập trình FPGA, triển khai thuật toán phần cứng tốc độ cao cho hệ thống nhúng và AI.

Giải pháp Camera tích hợp FPGA

Giải pháp camera tích hợp FPGA cho phép xử lý hình ảnh trực tiếp ở mức phần cứng, đáp ứng yêu cầu độ trễ thấp, tốc độ cao và độ ổn định cao so với xử lý bằng CPU/GPU truyền thống.

Hệ thống phù hợp cho các ứng dụng AI Vision, giám sát thông minh, công nghiệp, giao thông, với khả năng tùy biến pipeline xử lý ảnh, nén video và tăng tốc thuật toán theo yêu cầu thực tế.

viết đoạn code veri...
 
Chia sẻ:
Notifications
Clear all

viết đoạn code verilog de tao bo chia tan frequency divider

1 Bài viết
1 Thành viên
0 Reactions
150 Lượt xem
(@admin)
Bài viết: 178
Thành Viên Admin
Topic starter
 

1) Frequency divider /2, /4, /8… (chuẩn 50% duty, N = 2^k)

Cách đơn giản nhất: dùng bit của counter.

 

module freq_div_pow2 #(
    parameter integer K = 1   // chia cho 2^K
)(
    input  wire clk,
    input  wire rst_n,
    output wire clk_div
);

    reg [31:0] cnt;

    always @(posedge clk) begin
        if (!rst_n)
            cnt <= 32'd0;
        else
            cnt <= cnt + 32'd1;
    end

    assign clk_div = cnt[K-1]; // K=1 => /2, K=2 => /4, K=3 => /8 ...

endmodule

2) Divider chia N chẵn (clk_out 50% duty, chính xác)

Ý tưởng: đếm đến N/2 - 1 rồi toggle output → chu kỳ output = N chu kỳ input.

 

module freq_div_even #(
    parameter integer N = 10   // N phải là số chẵn: 2,4,6,...
)(
    input  wire clk,
    input  wire rst_n,
    output reg  clk_out
);
    localparam integer HALF = N/2;

    // đủ rộng để đếm tới HALF-1
    reg [$clog2(HALF)-1:0] cnt;

    initial clk_out = 1'b0;

    always @(posedge clk) begin
        if (!rst_n) begin
            cnt     <= 0;
            clk_out <= 1'b0;
        end else begin
            if (cnt == HALF-1) begin
                cnt     <= 0;
                clk_out <= ~clk_out;
            end else begin
                cnt <= cnt + 1'b1;
            end
        end
    end

endmodule

Ví dụ: N=10 → clk_out = clk_in / 10 (duty 50%).


3) Divider chia N bất kỳ (dễ dùng, N lẻ duty không 50%)

Cách này tạo 1 xung “tick” khi đếm đủ N, hoặc tạo clock bằng toggle mỗi N chu kỳ (khi đó output sẽ là / (2N)). Mình đưa bản toggle mỗi N chu kỳ (đơn giản, ổn định):

 

module freq_div_any #(
    parameter integer N = 5   // N >= 1
)(
    input  wire clk,
    input  wire rst_n,
    output reg  clk_out
);

    reg [$clog2(N)-1:0] cnt;

    initial clk_out = 1'b0;

    always @(posedge clk) begin
        if (!rst_n) begin
            cnt     <= 0;
            clk_out <= 1'b0;
        end else begin
            if (cnt == N-1) begin
                cnt     <= 0;
                clk_out <= ~clk_out;  // toggle mỗi N chu kỳ
            end else begin
                cnt <= cnt + 1'b1;
            end
        end
    end

endmodule

✅ Tần số đầu ra: f_out = f_in / (2*N)
Ví dụ N=5 → ra /10.


Chiến Thần IV Tạp Dịch

 
Đã đăng : 24/12/2025 16:15