配置篇
; Veriuser = veriuser.sl
Veriuser = novas.dll实战篇
│ rtl.f │ run.bat │ sim.do │ └─rtl clk_rst.v divider.v divider_tb.v
`timescale 1ns/10ps module divider( input i_clk, input i_rst_n, output o_clk ); parameter U_DLY = 1; // log2(5) = 2.3219 <= 3 reg [2:0] cnt_p; // 上升沿计数子 // 5位上升沿计数器: 0 ~ 4 // 4 = 5 - 1 always @ (posedge i_clk, negedge i_rst_n) begin if (!i_rst_n) cnt_p <= 0; else begin if (cnt_p == 4) cnt_p <= 0; else cnt_p <= #U_DLY cnt_p + 1'b1; end end // log2(5) = 2.3219 <= 3 reg [2:0] cnt_n; // 下降沿计数子 // 5位下降沿计数器: 0 ~ 4 // 4 = 5 - 1 always @ (negedge i_clk, negedge i_rst_n) begin if (!i_rst_n) cnt_n <= 0; else begin if (cnt_n == 4) cnt_n <= 0; else cnt_n <= #U_DLY cnt_n + 1'b1; end end reg o_clk_p; // 上升沿时钟输出寄存器 // 输出上升沿时钟 // 0 ~ 2 ↑-> 1 // (2+1) ~ 4 ↑-> 0 // 2 = 5>>1 // 4 = 5 - 1 always @ (posedge i_clk, negedge i_rst_n) begin if (!i_rst_n) o_clk_p <= 0; else begin if (cnt_p <= 2) // 2 = 5>>1 o_clk_p <= 1; else o_clk_p <= 0; end end reg o_clk_n; // 下降沿时钟输出寄存器 // 输出下降沿时钟 // 0 ~ 2 ↓-> 1 // (2+1) ~ 4 ↓-> 0 // 2 = 5>>1 // 4 = 5 - 1 always @ (negedge i_clk, negedge i_rst_n) begin if (!i_rst_n) o_clk_n <= 0; else begin if (cnt_n <= 2) // 2 = 5>>1 o_clk_n <= 1; else o_clk_n <= 0; end end assign o_clk = o_clk_n & o_clk_p; // 按位与(作用:掩码) endmodule
`timescale 1ns/10ps module clk_rst( output reg i_clk, output reg i_rst_n ); parameter CLK_PERIOD = 20; parameter MULT_RATIO = 10; parameter RESET_TIME = MULT_RATIO * CLK_PERIOD + 1; initial begin i_rst_n <= 1'b0; #RESET_TIME i_rst_n <= 1'b1; end initial begin i_clk <= 1'b0; forever #(CLK_PERIOD / 2) i_clk <= ~i_clk; end endmodule
`timescale 1ns/10ps module divider_tb(); wire i_clk; wire i_rst_n; wire o_clk; // genrate clock clk_rst clk_rst_inst( .i_clk(i_clk), .i_rst_n(i_rst_n) ); // user logic divider divider_inst( .i_clk(i_clk), .i_rst_n(i_rst_n), .o_clk(o_clk) ); // dump fsdb file for debussy initial begin $fsdbDumpfile("wave.fsdb"); $fsdbDumpvars; end endmodule
// dump fsdb file for debussy initial begin $fsdbDumpfile("wave.fsdb"); $fsdbDumpvars; end
rtl/divider.v rtl/clk_rst.v rtl/divider_tb.v
vlib work vlog -f rtl.f vsim work.divider_tb run 10us q
::关闭回显 @ECHO OFF ::设置软件路径 SET debussy=C:\Novas\Debussy\bin\Debussy.exe SET vsim=C:\modeltech_6.5\win32\vsim.exe ::ModelSim Command %vsim% -c -do sim.do ::删除ModelSim生成的相关文件 RD work /s /q DEL transcript vsim.wlf /q ::Debussy Command %debussy% -f rtl.f -ssf wave.fsdb -2001 ::删除波形文件 DEL wave.fsdb /q ::删除Debussy生成的相关文件 RD Debussy.exeLog /s /q DEL debussy.rc /q ::退出命令行 EXIT