# Implement controller of transducer in Verilog by FPGA (demo2)
```=v
/*
Filename : top_module.v
Simulator : Quartus II 20.1 ModelSim 2020.1
scription : 第二版Transducer控制電路
Release : Aug.30,2021
*/
module top_module (
input clk,
input reset,
output reg ch1
);
//===========================================
//parameter
//===========================================
parameter start_n_ms=32'd3000, //一開始要延遲多久
clk_count=32'd150000000, //要幾個clk
//clk的週期要多少
//state parameter
idle_state=1'd0,
clk_state=1'd1,
stop_state=2'd2;
//===========================================
//reg
//===========================================
reg [31:0] count_nms;
reg [31:0] start_n_ms_reg=start_n_ms;
reg [31:0]nms_counts;
reg [31:0] clk_count_reg=clk_count; //用來存放clk state要數的的clk數量
reg [31:0] clk_count_cnt; //clk state的計數器
reg [1:0] state=idle_state , next_state;
//===========================================
//數nms所需的clk數 (clk為50Mhz)
//===========================================
always@(*)
begin
nms_counts=start_n_ms_reg*50000;
end
//===========================================
//數nms的counter (clk為50Mhz)
//===========================================
always@(posedge clk)
begin
if (reset || state!=1'd0) begin
count_nms<=1'd0;
end
else if (count_nms == nms_counts-1'd1) begin
count_nms<=1'd0;
end
else begin
count_nms<=count_nms+1'd1;
end
end
// //===========================================
// //輸出波型 (clk)
// //===========================================
always@(posedge clk)
begin
if (reset || state!=1'd1) begin
clk_count_cnt<=1'd0;
end
else if (clk_count_cnt==clk_count_reg-1'd1) begin
clk_count_cnt<=1'd0;
end
else begin
clk_count_cnt<=clk_count_cnt+1'd1;
end
end
// //===========================================
// //fsm
// //===========================================
always@(posedge clk)
begin
if (reset) state<=idle_state;
else state<=next_state;
end
always@(*)
begin
case (state)
idle_state: if (count_nms == nms_counts-1'd1) next_state=clk_state;
else next_state=state;
clk_state: if (clk_count_cnt == clk_count_reg-1'd1) next_state=stop_state;
else next_state=state;
stop_state: next_state=state;
default: next_state=state;
endcase
end
always@(*)
begin
case (state)
idle_state: ch1=1'd0;
clk_state: ch1=clk;
stop_state: ch1=1'd0;
default: ch1=1'd0;
endcase
end
endmodule
```
tb
```=v
/*
Filename : top_module.v
Simulator : Quartus II 20.1 ModelSim 2020.1
scription : 第二版Transducer控制電路tb
Release : Aug.30,2021
*/
//================================================================
//設定timescale
//================================================================
`timescale 1ns/100ps
//================================================================
//設定testbench名
//================================================================
module top_module_test;
//================================================================
//input用reg output用wire
//================================================================
reg reset,clk;
wire ch1;
//================================================================
//引用待測模組
//================================================================
top_module t1(.reset(reset),
.clk(clk),
.ch1(ch1));
//================================================================
//clk signal
//================================================================
initial #0 clk=1'b0;
always #10 clk =~clk;
//================================================================
//input
//================================================================
initial
begin: in_set_blk
#0 reset=1'd1;
#20 reset=1'd0;
end
//================================================================
//signals display
// //================================================================
initial
begin: display_set_blk
integer i;
for (i=0;i<80;i=i+1) begin
#500000 $display (" time=",$time, " count_nms=%d clk_count_cnt=%d \n",t1.count_nms,t1.clk_count_cnt); //0.5ms取一次資料
$display (" time=",$time, " state=%d next_state=%d \n",t1.state,t1.next_state);
end
#10 $stop;
#10 $finish;
end
endmodule
```