mirror of
https://github.com/trcwm/Speech256.git
synced 2025-06-07 16:48:32 +02:00
155 lines
3.4 KiB
Verilog
155 lines
3.4 KiB
Verilog
//
|
|
// Speech256 DE0 board top level
|
|
//
|
|
// Niels Moseley - Moseley Instruments 2017
|
|
// http://www.moseleyinstruments.com
|
|
//
|
|
|
|
`define USE_SDDAC
|
|
|
|
module Speech256_DE0 (
|
|
CLOCK_50,
|
|
SW,
|
|
BUTTON,
|
|
LEDG,
|
|
UART_TXD
|
|
);
|
|
|
|
input CLOCK_50;
|
|
input [0:5] SW;
|
|
input [0:2] BUTTON;
|
|
output [9:0] LEDG;
|
|
output UART_TXD;
|
|
|
|
reg [5:0] data_in;
|
|
reg data_stb;
|
|
reg clk;
|
|
reg [3:0] divcnt; // clock divider counter
|
|
reg [2:0] cur_state, next_state;
|
|
|
|
reg [2:0] rom_addr;
|
|
reg [5:0] rom_data;
|
|
reg inc_rom_addr;
|
|
|
|
// debug signals for 16-bit DAC
|
|
wire sample_stb;
|
|
wire signed [15:0] sample_out;
|
|
|
|
wire ldq;
|
|
wire rst_an;
|
|
|
|
SPEECH256_TOP u_speech256_top (
|
|
.clk (clk),
|
|
.rst_an (rst_an),
|
|
.ldq (ldq),
|
|
.data_in (rom_data),
|
|
.data_stb (data_stb),
|
|
.pwm_out (UART_TXD),
|
|
.sample_out (sample_out),
|
|
.sample_stb (sample_stb)
|
|
);
|
|
|
|
assign rst_an = 1'b1;
|
|
|
|
parameter S_IDLE = 4'b000,
|
|
S_ALLOPHONE = 4'b001,
|
|
S_WAITDONE = 4'b010;
|
|
|
|
always @(posedge CLOCK_50)
|
|
begin
|
|
|
|
// clock divider to generate 2.5 MHz for Speech256
|
|
if (divcnt > 9)
|
|
begin
|
|
clk <= !clk;
|
|
divcnt <= 0;
|
|
end
|
|
else
|
|
begin
|
|
divcnt <= divcnt + 1;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk)
|
|
begin
|
|
cur_state <= next_state;
|
|
if (inc_rom_addr == 1)
|
|
rom_addr <= rom_addr + 1;
|
|
end
|
|
|
|
//assign LEDG[9:0] = sample_out[15:6];
|
|
assign LEDG[0] = BUTTON[0];
|
|
assign LEDG[1] = ldq;
|
|
assign LEDG[2] = SW[2];
|
|
assign LEDG[3] = SW[3];
|
|
assign LEDG[4] = 0;
|
|
|
|
always @(*)
|
|
begin
|
|
// FSM defaults
|
|
data_stb <= 0;
|
|
inc_rom_addr <= 0;
|
|
next_state <= cur_state;
|
|
|
|
case(cur_state)
|
|
S_IDLE:
|
|
begin
|
|
if ((ldq == 1) && (BUTTON[0] == 1))
|
|
begin
|
|
inc_rom_addr <= 1;
|
|
next_state <= S_ALLOPHONE;
|
|
end
|
|
else
|
|
next_state <= S_IDLE;
|
|
end
|
|
S_ALLOPHONE:
|
|
begin
|
|
data_stb <= 1;
|
|
next_state <= S_WAITDONE;
|
|
end
|
|
S_WAITDONE:
|
|
begin
|
|
if (ldq == 0)
|
|
begin
|
|
inc_rom_addr <= 1;
|
|
next_state <= S_IDLE;
|
|
end
|
|
end
|
|
default:
|
|
begin
|
|
next_state <= S_IDLE;
|
|
end
|
|
endcase
|
|
|
|
// allophone ROM
|
|
// hello, world
|
|
case (rom_addr)
|
|
3'd0:
|
|
rom_data <= 6'h1B;
|
|
3'd1:
|
|
rom_data <= 6'h07;
|
|
3'd2:
|
|
rom_data <= 6'h2D;
|
|
3'd3:
|
|
rom_data <= 6'h35;
|
|
3'd4:
|
|
rom_data <= 6'h03;
|
|
3'd5:
|
|
rom_data <= 6'h2E;
|
|
3'd6:
|
|
rom_data <= 6'h1E;
|
|
3'd7:
|
|
rom_data <= 6'h33;
|
|
3'd8:
|
|
rom_data <= 6'h2D;
|
|
3'd9:
|
|
rom_data <= 6'h15;
|
|
3'd10:
|
|
rom_data <= 6'h03;
|
|
default:
|
|
rom_data <= 6'h00;
|
|
endcase
|
|
end
|
|
|
|
endmodule
|