Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a86450a97 | ||
|
|
c7c804a5f9 | ||
|
|
15b48049ab | ||
|
|
97113a9804 | ||
|
|
71fd941588 | ||
|
|
a27d049f76 | ||
|
|
17f361ea12 | ||
|
|
730cc895b1 | ||
|
|
019dc2868e | ||
|
|
b30efd039d | ||
|
|
ecd6f16dbe | ||
|
|
6a72019f25 | ||
|
|
53868c67fd | ||
|
|
6ab278694e | ||
|
|
026899b930 | ||
|
|
9ffb72cf97 | ||
|
|
72c964475f | ||
|
|
d2aa8277c7 | ||
|
|
c93bdaf629 | ||
|
|
1be3ce1cea | ||
|
|
4b0451fc63 | ||
|
|
20f8e707bd | ||
|
|
c46a1c3b33 | ||
|
|
6b874ba5c7 | ||
|
|
200a989683 | ||
|
|
613bffbcfc | ||
|
|
19177edb3f | ||
|
|
0ecac8324e | ||
|
|
b8d834144b |
No files matched your search
@@ -9,7 +9,6 @@ interface Bus_if (input clk);
|
|||||||
logic[9:0] Data;
|
logic[9:0] Data;
|
||||||
logic SendData;
|
logic SendData;
|
||||||
logic TimerMeas;
|
logic TimerMeas;
|
||||||
logic Clk;
|
|
||||||
logic DataValid;
|
logic DataValid;
|
||||||
logic AlarmAmpel;
|
logic AlarmAmpel;
|
||||||
logic TasteAktiv;
|
logic TasteAktiv;
|
||||||
@@ -19,4 +18,28 @@ interface Bus_if (input clk);
|
|||||||
logic ReadTemp;
|
logic ReadTemp;
|
||||||
logic LEDg;
|
logic LEDg;
|
||||||
logic LEDr;
|
logic LEDr;
|
||||||
|
|
||||||
|
modport Fsm (
|
||||||
|
input clk,
|
||||||
|
input AlarmAmpel,
|
||||||
|
input DataValid,
|
||||||
|
input TasteAktiv,
|
||||||
|
output Alarm_R,
|
||||||
|
output SendData,
|
||||||
|
output TimerEN
|
||||||
|
);
|
||||||
|
|
||||||
|
modport timer (
|
||||||
|
input clk,
|
||||||
|
input Taste,
|
||||||
|
input TimerEN,
|
||||||
|
output ReadTemp,
|
||||||
|
output TasteAktiv
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
module parallelport wird in top level design
|
||||||
|
ohne modport verbunden, da inEndOfConv nicht
|
||||||
|
Teil des Bus_if ist.
|
||||||
|
*/
|
||||||
endinterface //Bus
|
endinterface //Bus
|
||||||
@@ -3,8 +3,6 @@ input wire clk12M,
|
|||||||
input wire rst,
|
input wire rst,
|
||||||
input wire [7:0] data_input,
|
input wire [7:0] data_input,
|
||||||
input wire data_valid,
|
input wire data_valid,
|
||||||
output reg REDn,
|
|
||||||
output reg GRNn,
|
|
||||||
output reg RED,
|
output reg RED,
|
||||||
output reg GRN,
|
output reg GRN,
|
||||||
output reg alarm
|
output reg alarm
|
||||||
@@ -12,7 +10,8 @@ output reg alarm
|
|||||||
|
|
||||||
wire red_pwm;
|
wire red_pwm;
|
||||||
wire grn_pwm;
|
wire grn_pwm;
|
||||||
|
reg REDn;
|
||||||
|
reg GRNn;
|
||||||
defparam U1.on_hi = 2'b10;
|
defparam U1.on_hi = 2'b10;
|
||||||
defparam U1.on_lo = 2'b01;
|
defparam U1.on_lo = 2'b01;
|
||||||
defparam U1.off = 2'b00;
|
defparam U1.off = 2'b00;
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
`include "../fsm/Fsm.sv"
|
||||||
|
`include "../Bus_if/Bus_if.sv"
|
||||||
|
`include "../timer_port/timer_top.sv"
|
||||||
|
`include "../spi_interface_radiant/spi_interface.sv"
|
||||||
|
|
||||||
|
module Top(
|
||||||
|
input wire clk,
|
||||||
|
input wire rst,
|
||||||
|
input wire endOfConv,
|
||||||
|
output wire LEDg,
|
||||||
|
output wire LEDr,
|
||||||
|
output wire AlarmAmpel,
|
||||||
|
output wire Alarm_R
|
||||||
|
);
|
||||||
|
// Bus (Interface)
|
||||||
|
Bus_if bus(.clk(clk));
|
||||||
|
// SPI Interface
|
||||||
|
spi_interface_ports spi_bus(.clk(clk));
|
||||||
|
|
||||||
|
// FSM
|
||||||
|
Fsm fsm(
|
||||||
|
.clk(clk),
|
||||||
|
.inAlarmAmpel(bus.AlarmAmpel),
|
||||||
|
.inDataValid(bus.DataValid),
|
||||||
|
.inTasteAktiv(bus.TasteAktiv),
|
||||||
|
.outAlarm_R(bus.Alarm_R),
|
||||||
|
.outSendData(bus.SendData),
|
||||||
|
.outTimerEN(bus.TimerEN)
|
||||||
|
);
|
||||||
|
// Parallelport
|
||||||
|
parallelport parallelport1 (
|
||||||
|
.inClk(clk),
|
||||||
|
.inTimerMeas(bus.TimerMeas),
|
||||||
|
.inEndOfConv(endOfConv),
|
||||||
|
.inData(bus.Data),
|
||||||
|
.outDataValid(bus.DataValid),
|
||||||
|
.outData(bus.Data)
|
||||||
|
);
|
||||||
|
// FRAM-Controller
|
||||||
|
// Timer
|
||||||
|
timer timer1 (
|
||||||
|
.inClk(clk),
|
||||||
|
.inTaste(bus.Taste),
|
||||||
|
.inEN(bus.TimerEN),
|
||||||
|
.outReadTemp(bus.ReadTemp),
|
||||||
|
.outTasteAktiv(bus.TasteAktiv)
|
||||||
|
);
|
||||||
|
// Ampelsteuerung
|
||||||
|
led_top ampelsteuerung (
|
||||||
|
.clk12M(clk),
|
||||||
|
.rst(rst),
|
||||||
|
.data_input(bus.Data),
|
||||||
|
.data_valid(bus.DataValid),
|
||||||
|
.RED(LEDr),
|
||||||
|
.GRN(LEDg),
|
||||||
|
.alarm(bus.AlarmAmpel)
|
||||||
|
);
|
||||||
|
|
||||||
|
assign AlarmAmpel = bus.AlarmAmpel;
|
||||||
|
assign Alarm_R = bus.Alarm_R;
|
||||||
|
|
||||||
|
assign bus.sbclk = spi_bus.sb_clk_i;
|
||||||
|
assign bus.sbstb = spi_bus.sb_stb_i;
|
||||||
|
assign bus.sbrw = spi_bus.sb_wr_i;
|
||||||
|
assign bus.sbadr = spi_bus.sb_adr_i;
|
||||||
|
assign bus.sbdat_r = spi_bus.sb_dat_i;
|
||||||
|
assign bus.sbdat_w = spi_bus.sb_dat_o;
|
||||||
|
assign bus.sback = spi_bus.sb_ack_o;
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
// Project: ESY-Praktikum-Testbench
|
||||||
|
// File: random_tl.sv
|
||||||
|
// Title: Random Testbench Toplevel
|
||||||
|
// Description: Creates a Testbench that tests the Toplevel-Design with random based verifikation
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Notes:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Development History:
|
||||||
|
//
|
||||||
|
// __DATE__ _BY_ _REV_ _DESCRIPTION___________________________
|
||||||
|
// 14/06/22 JU/TL 1.0 Initial testbench design
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Dependencies:
|
||||||
|
// Toplevel-Design
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Testbench
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------
|
||||||
|
|
||||||
|
class Taster_rnd;
|
||||||
|
rand bit [1:0] data;
|
||||||
|
constraint Rst_rnd
|
||||||
|
{
|
||||||
|
data dist {0:=70,1 :=30};
|
||||||
|
}
|
||||||
|
endclass
|
||||||
|
|
||||||
|
class Data_ADC_rnd;
|
||||||
|
rand bit [7:0] data;
|
||||||
|
endclass
|
||||||
|
|
||||||
|
|
||||||
|
`timescale 1ns/1ps
|
||||||
|
module tb;
|
||||||
|
|
||||||
|
// inputs and outputs
|
||||||
|
reg taster;
|
||||||
|
reg [7:0]data_ADC;
|
||||||
|
reg clk12M;
|
||||||
|
wire RED;
|
||||||
|
wire GRN;
|
||||||
|
wire alarm;
|
||||||
|
wire alarm_r;
|
||||||
|
wire SI;
|
||||||
|
wire SO;
|
||||||
|
wire SCK;
|
||||||
|
wire nCS;
|
||||||
|
reg endOfConvRnd;
|
||||||
|
|
||||||
|
//random
|
||||||
|
Taster_rnd taster_rnd = new();
|
||||||
|
Data_ADC_rnd data_ADC_rnd = new();
|
||||||
|
|
||||||
|
// connect module
|
||||||
|
SPI_FRAM_Module fram_storage(
|
||||||
|
.SI(SI),
|
||||||
|
.SO(SO),
|
||||||
|
.SCK(SCK),
|
||||||
|
.nCS(nCS),.opcode(),.addr());
|
||||||
|
Top top(.clk(clk12M),.rst(taster),.endOfConv(endOfConvRnd),.LEDg(GRN),.LEDr(RED),.AlarmAmpel(alarm),.Alarm_R(alarm_r));
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
clk12M=1'b0;
|
||||||
|
end
|
||||||
|
always
|
||||||
|
#41.666666 clk12M=~clk12M; //clock generation
|
||||||
|
|
||||||
|
//random test
|
||||||
|
initial begin
|
||||||
|
endOfConvRnd = 1;
|
||||||
|
repeat (2) begin
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
#100000000
|
||||||
|
data_ADC_rnd.randomize();
|
||||||
|
taster_rnd.randomize();
|
||||||
|
|
||||||
|
taster = taster_rnd.data;
|
||||||
|
data_ADC = data_ADC_rnd.data;
|
||||||
|
|
||||||
|
|
||||||
|
// assertions
|
||||||
|
|
||||||
|
// assert color green
|
||||||
|
assert property(@(posedge clk12M) disable iff (alarm | alarm_r) ((data_ADC < 100) |=> ##4 (!RED && GRN)));
|
||||||
|
|
||||||
|
//assert color yellow
|
||||||
|
|
||||||
|
assert property(@(posedge clk12M) disable iff (alarm | alarm_r) (((data_ADC >= 100) && (data_ADC <= 168))|=> ##4 (RED && GRN)));
|
||||||
|
|
||||||
|
//assert color red + alarm
|
||||||
|
|
||||||
|
assert property(@(posedge clk12M) disable iff (alarm_r) (data_ADC > 168) |=> ##4 (RED && !GRN && alarm));
|
||||||
|
|
||||||
|
//assert alarm reset working
|
||||||
|
|
||||||
|
assert property(@(posedge clk12M) (alarm_r |=> ##4 (!RED && !GRN && !alarm)));
|
||||||
|
|
||||||
|
$monitor("time=%t, data_ADC=%d, RED=%d, GRN=%d, taster=%d",$time,data_ADC, RED, GRN, taster);
|
||||||
|
end
|
||||||
|
$stop;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
`include "Top.sv"
|
||||||
|
|
||||||
|
module tb_Top;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 73 KiB |
@@ -0,0 +1,87 @@
|
|||||||
|
// Code your testbench here
|
||||||
|
// or browse Examples
|
||||||
|
|
||||||
|
|
||||||
|
`timescale 1ns/1ps;
|
||||||
|
module tb();
|
||||||
|
reg inClk, inEN, inTaste;
|
||||||
|
wire outReadTemp;
|
||||||
|
wire outTasteAktiv;
|
||||||
|
|
||||||
|
reg [7:0] inData;
|
||||||
|
reg inEndOfConv;
|
||||||
|
wire outDataValid;
|
||||||
|
wire [7:0] outData;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
timer t1 (.inClk(inClk),
|
||||||
|
.inTaste(inTaste),
|
||||||
|
.inEN(inEN),
|
||||||
|
.outReadTemp(outReadTemp),
|
||||||
|
.outTasteAktiv(outTasteAktiv));
|
||||||
|
|
||||||
|
|
||||||
|
parallelport p1 (.inData(inData),
|
||||||
|
.inClk(inClk),
|
||||||
|
.inTimerMeas(outReadTemp),
|
||||||
|
.inEndOfConv(inEndOfConv),
|
||||||
|
.outDataValid(outDataValid),
|
||||||
|
.outData(outData));
|
||||||
|
|
||||||
|
|
||||||
|
always #83 inClk <= ~inClk;
|
||||||
|
always #1000000000 inEndOfConv <= ~inEndOfConv;
|
||||||
|
always #100000000 inData = inData +1;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
//$dumpfile("dump.vcd");
|
||||||
|
//$dumpvars;
|
||||||
|
inClk <= 0;
|
||||||
|
inEN <= 0;
|
||||||
|
inTaste <= 0;
|
||||||
|
|
||||||
|
inData <= 8'b0;
|
||||||
|
inEndOfConv <= 0;
|
||||||
|
#1000000000
|
||||||
|
inTaste = 1;
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
inTaste = 0;
|
||||||
|
#1000000000
|
||||||
|
inEN <= 1;
|
||||||
|
#1000000000
|
||||||
|
inEN <= 0;
|
||||||
|
#1000000000
|
||||||
|
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
#1000000000
|
||||||
|
$stop;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*Timer soll signalisieren, wenn 10 Sekunden vorbei sind.
|
||||||
|
Zusätzlich soll der Taster abgefragt werden. Wenn der Taster für 1 Sekunde aktiv ist, soll es signalisiert werden.
|
||||||
|
|
||||||
|
inClk: Eingang für Clock 12MHz
|
||||||
|
inTaste: Eingang Taster
|
||||||
|
inEN: Enable Pin, wenn HIGH dann stoppt Timer
|
||||||
|
outReadTemp: signalisiert, dass 10 Sekunden vorbei sind
|
||||||
|
outTasteAktiv: signalisiert, dass der Taster betätigt wurde
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
module timer(input inClk, inTaste, inEN, output reg outReadTemp, outTasteAktiv);
|
||||||
|
//Wird genutzt um den Eingangstakt zu teilen.
|
||||||
|
int divide1 = 30000000;
|
||||||
|
int divide2 = 60000;
|
||||||
|
|
||||||
|
//Interne Zwischenspeicher;
|
||||||
|
logic state = 0;
|
||||||
|
logic [31:0] count1 = 32'b0;
|
||||||
|
logic [31:0] count2 = 32'b0;
|
||||||
|
|
||||||
|
//Initialisierung
|
||||||
|
initial begin
|
||||||
|
outReadTemp = 0;
|
||||||
|
outTasteAktiv = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge inClk or posedge inEN) begin
|
||||||
|
//Bei positiver Flanke und inEN auf HIGH wird Timer gestoppt
|
||||||
|
if(inEN) begin
|
||||||
|
count1 <= 0;
|
||||||
|
count2 <= 0;
|
||||||
|
outReadTemp <= 0;
|
||||||
|
end
|
||||||
|
//sonst wird counter1 inkrementiert
|
||||||
|
else begin
|
||||||
|
count1 <= count1 +1;
|
||||||
|
if(count1>=((2**32)-1))
|
||||||
|
count1 <= 32'b0;
|
||||||
|
//wenn counter1 durch divide1 teilbar ist, so wird outReadTemp getoggelt --> es erfolgt ca. alle 5 Sekunden ein toggeln
|
||||||
|
//outReadTemp ist für 5 Sekunden HIGH und 5 Sekunden LOW
|
||||||
|
if(count1 % divide1 == 0)
|
||||||
|
outReadTemp <= ~outReadTemp;
|
||||||
|
|
||||||
|
//Bei positiver Flanke wird Taster abgefragt
|
||||||
|
//Solange Taster HIGH ist wird counter2 erhöht
|
||||||
|
if(inTaste) begin
|
||||||
|
count2 <= count2 +1;
|
||||||
|
//Sobald counter2 den Wert 6 000 000 übersteigt, wird outTasteAktiv auf HIGH gesetzt --> Taster wurde 1 Sekunde betätigt
|
||||||
|
if(count2 >= 6000000)
|
||||||
|
outTasteAktiv = 1;
|
||||||
|
end
|
||||||
|
//Wenn Taster losgelassen wird, dann wird Ausgang und counter2 zurück gesetzt.
|
||||||
|
else begin
|
||||||
|
outTasteAktiv <= 0;
|
||||||
|
count2 <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule // clk_divider
|
||||||
|
|
||||||
|
|
||||||
|
/*Parallelport, soll die Daten des ADC alle 10 Sekunden auslesen und auf den Bus legen.
|
||||||
|
|
||||||
|
inClk: Eingang für Clock 12MHz
|
||||||
|
inTimerMeas: Eingang des 10 Sekunden Takt des Timers
|
||||||
|
inEndOdConv: Eingang vom ADC; Signalisiert valide Daten im ADC
|
||||||
|
[7:0] inData: Eingang der Daten (parallel)
|
||||||
|
outDataValid: Signalisiert, dass Daten auf Bus vaild sind
|
||||||
|
[7:0] outData: Ausgang der Daten (parallel)
|
||||||
|
*/
|
||||||
|
|
||||||
|
module parallelport(input inClk, inTimerMeas, inEndOfConv, [7:0] inData, output reg outDataValid, [7:0] outData);
|
||||||
|
|
||||||
|
//Zwischenspeicher der Daten
|
||||||
|
logic [7:0] storage = 8'b0;
|
||||||
|
|
||||||
|
//Initalisierung
|
||||||
|
initial begin
|
||||||
|
outDataValid <= 0;
|
||||||
|
outData <= 8'b0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge inClk) begin
|
||||||
|
//Wenn inEndOfConv HIGH ist, dann werden die Daten in den Zwischenspeicher gelegt
|
||||||
|
if(inEndOfConv)
|
||||||
|
storage <= inData;
|
||||||
|
//Wenn inTimerMeas HIGH ist, dann werden die Daten aus dem Zwischenspeicher in das Ausgangsregister gelegt
|
||||||
|
//Außerdem wird outDataValid auf HIGH gesetzt, was dem Bus signalisiert, dass die Daten gelesen werden können
|
||||||
|
if(inTimerMeas == 1 && outDataValid == 0) begin
|
||||||
|
outData = storage;
|
||||||
|
outDataValid <= 1;
|
||||||
|
end
|
||||||
|
//Wenn inTimerMeas LOW ist, dann wird outDataValid auf LOW gesetzt
|
||||||
|
else if(inTimerMeas == 0)
|
||||||
|
outDataValid <= 0;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||