8-bit PWM dac

This commit is contained in:
Niels Moseley 2017-10-10 00:25:52 +02:00
parent 70b80d4154
commit 8e3de97977
3 changed files with 112 additions and 0 deletions

70
verilog/pwmdac/pwmdac.v Normal file
View 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

View 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

View 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 ..