mirror of
https://github.com/trcwm/Speech256.git
synced 2025-06-07 16:48:32 +02:00
8-bit PWM dac
This commit is contained in:
parent
70b80d4154
commit
8e3de97977
70
verilog/pwmdac/pwmdac.v
Normal file
70
verilog/pwmdac/pwmdac.v
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
//
|
||||||
|
// Very simple, i.e. 8-bit non noise-shaping pulse-width modulation (PWM) DAC.
|
||||||
|
// The DAC has a pull interface.
|
||||||
|
//
|
||||||
|
// Niels Moseley - Moseley Instruments 2017
|
||||||
|
// http://www.moseleyinstruments.com
|
||||||
|
//
|
||||||
|
|
||||||
|
module PWMDAC (
|
||||||
|
clk,
|
||||||
|
rst_an,
|
||||||
|
din,
|
||||||
|
din_ack,
|
||||||
|
dacout
|
||||||
|
);
|
||||||
|
|
||||||
|
//////////// CLOCK //////////
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
//////////// RESET, ACTIVE LOW //////////
|
||||||
|
input rst_an;
|
||||||
|
|
||||||
|
//////////// DAC OUTPUT //////////
|
||||||
|
output reg dacout;
|
||||||
|
|
||||||
|
//////////// DATA BUS //////////
|
||||||
|
input signed [7:0] din;
|
||||||
|
output reg din_ack; // is high for 1 clock cycle after reading the din signal
|
||||||
|
|
||||||
|
|
||||||
|
// internal counter and data registers
|
||||||
|
reg signed [7:0] counter;
|
||||||
|
reg signed [7:0] data;
|
||||||
|
|
||||||
|
always @(posedge clk, negedge rst_an)
|
||||||
|
begin
|
||||||
|
if (rst_an == 0)
|
||||||
|
begin
|
||||||
|
// reset values
|
||||||
|
counter <= 0;
|
||||||
|
dacout <= 0;
|
||||||
|
din_ack <= 0;
|
||||||
|
data <= 0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
// increment counter
|
||||||
|
counter <= counter + 8'b00000001;
|
||||||
|
|
||||||
|
// compare counter with data
|
||||||
|
// and set output accordingly.
|
||||||
|
if (data > counter)
|
||||||
|
dacout <= 1;
|
||||||
|
else
|
||||||
|
dacout <= 0;
|
||||||
|
|
||||||
|
// load new data into DAC when
|
||||||
|
// counter is 255
|
||||||
|
if (counter == 8'h7F)
|
||||||
|
begin
|
||||||
|
data <= din;
|
||||||
|
din_ack <= 1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_ack <= 0;
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
37
verilog/pwmdac/pwmdac_tb.v
Normal file
37
verilog/pwmdac/pwmdac_tb.v
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//
|
||||||
|
// PWMDAC testbench
|
||||||
|
//
|
||||||
|
// Niels Moseley - Moseley Instruments 2017
|
||||||
|
// http://www.moseleyinstruments.com
|
||||||
|
//
|
||||||
|
|
||||||
|
module PWMDAC_TB;
|
||||||
|
reg clk, rst_an;
|
||||||
|
reg signed [0:7] din;
|
||||||
|
wire dacout, din_ack;
|
||||||
|
|
||||||
|
PWMDAC u_pwmdac (
|
||||||
|
.clk (clk),
|
||||||
|
.rst_an (rst_an),
|
||||||
|
.din (din),
|
||||||
|
.din_ack (din_ack),
|
||||||
|
.dacout (dacout)
|
||||||
|
);
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$dumpfile ("pwmdac.vcd");
|
||||||
|
$dumpvars;
|
||||||
|
clk = 0;
|
||||||
|
rst_an = 0;
|
||||||
|
din = 0;
|
||||||
|
#3
|
||||||
|
rst_an = 1;
|
||||||
|
#10240
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
always
|
||||||
|
#5 clk = !clk;
|
||||||
|
|
||||||
|
endmodule
|
5
verilog/pwmdac/run_tb.bat
Normal file
5
verilog/pwmdac/run_tb.bat
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
mkdir bin
|
||||||
|
C:\iverilog\bin\iverilog -o bin\pwmdac.vvp -g2005 -s PWMDAC_TB pwmdac.v pwmdac_tb.v
|
||||||
|
cd bin
|
||||||
|
C:\iverilog\bin\vvp pwmdac.vvp
|
||||||
|
cd ..
|
Loading…
x
Reference in New Issue
Block a user