【问题标题】:Clock Divider for 50MHz to 1MHz - Verilog50MHz 至 1MHz 的时钟分频器 - Verilog
【发布时间】:2022-01-12 01:32:18
【问题描述】:

我已经为 SPI Master 编写了代码,我希望输出 SPI 频率为 1MHz。

但是,当我运行行为模拟时,我没有得到 1MHz 的 spi_sclk。有什么建议我的代码有什么问题吗?谢谢!

 module spi_master(
    input wire clk,
    input wire reset,

    input wire [15:0] datain,

    output wire spi_cs_l,
    output wire spi_sclk,
    output wire spi_data,
    output wire [4:0] counter
);

reg [15:0] MOSI;
reg [4:0] count;
reg cs_l;
reg sclk = 1'b0;
reg [2:0] state;

reg [4:0] clk_counter = 0;

// SPI Output Clock frequency = 1MHz

always @(posedge clk) begin
    if (clk_counter == 24) begin
        clk_counter <= 0;
        sclk <= ~sclk;
    end
    else begin
        clk_counter <= clk_counter + 1'd1;
    end
end

always @(posedge clk or posedge reset) begin
    if(reset) begin
        MOSI <= 16'b0;
        count <= 5'd16;
        cs_l <= 1'b1;
    end
    else begin
        case (state)
        0:begin
            cs_l <= 1'b1;
            state <= 1;
        end
        1:begin
            cs_l <= 1'b0;
            MOSI <= datain[count-1];
            count <= count-1;
            state <= 2;
        end
        2:begin
            if(count > 0) begin
                state <= 1;
            end
            else begin
                count <= 16;
                state <= 0;
            end
        end
        default:state<=0;
        endcase
    end
end

assign spi_cs_l = cs_l;
assign spi_sclk = sclk;
assign spi_data = MOSI;
assign counter = count;

endmodule

测试台

module spi_master_tb;

// Inputs

reg clk;
reg reset;
reg [15:0] datain;

// Outputs

wire spi_cs_l;
wire spi_sclk;
wire spi_data;
wire [4:0] counter;


spi_master dut(
    .clk(clk),
    .reset(reset),
    .counter(counter),
    .datain(datain),
    .spi_cs_l(spi_cs_l),
    .spi_sclk(spi_sclk),
    .spi_data(spi_data)
);


initial begin
    clk = 0;
    reset = 1;
    datain = 0;
end

always #5 clk=~clk;

initial begin
    #10 reset = 1'b0;

    #10 datain = 16'hA569;
    #335 datain = 16'h2563;
    #335 datain = 16'h9B63;
    #335 datain = 16'h6A61;

end

endmodule

波形

【问题讨论】:

  • 你会得到什么?
  • @mkrieger1 100MHz 时钟
  • 您没有收到任何警告说您有多个spi_sclk 的驱动程序吗?您正在从 spi_sclk &lt;= ~spi_sclk;assign spi_sclk = sclk; 分配给它。
  • 如果你想除以 50,你可以数到 24,如果达到 24,则切换输出时钟,或者你可以数到 49,如果计数小于 25 和 0,则输出 1否则。目前你正在做两者的混合。
  • 使用 50 MHz 作为输入,而不是 100 MHz。

标签: verilog


【解决方案1】:

如果您创建 Minimal reproducible example 会有所帮助。此外,您的波形不包含重要信号clk_counter

在您的测试平台中尝试这个,如果它不起作用,您至少有最小的可重现示例。

我更改了clk_counter 的初始化,并且在增量中我只是添加了1 而不是1'b1,如果您想要严格,可以添加一个5 位宽的1 (5'b1)。


module spi_master(
    input wire clk,
    input wire reset,
    output wire spi_sclk,
);

reg [4:0] clk_counter;

// SPI Output Clock frequency = 1MHz

always @(posedge clk) begin
  if(reset) begin
    sclk <= 1'b0;
    clk_counter <= 1;
  end
  else begin
    if (clk_counter == 24) begin
        clk_counter <= 0;
        sclk <= ~sclk;
    end
    else begin
        clk_counter <= clk_counter + 1;
    end
  end
end

assign spi_sclk = sclk;
endmodule

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多