Compare commits

..
29 Commits
Author SHA1 Message Date
reussch78773 6a86450a97 Kommentare in Sourcecode ergänzt 2022-06-22 21:02:47 +02:00
ueblerju79024 c7c804a5f9 Verbesserte TB
#100000000 muss öfter aufgerufen werden, sonst zahl zu groß
tb ist noch nicht einmal komplett durchgelaufen
2022-06-17 10:58:29 +00:00
sessleral71711 15b48049ab Added SPI interface to top level design 2022-06-17 11:58:02 +02:00
sessleral71711 97113a9804 modports angepasst 2022-06-17 11:49:26 +02:00
badenbergra78621 71fd941588 modports angepasst 2022-06-17 09:42:53 +00:00
ueblerju79024 a27d049f76 Anfänge einer Tl-TB
Fehlt noch instanziierung modul TL und so weiter und so
2022-06-14 10:53:32 +00:00
sessleral71711 17f361ea12 I hate git 2022-06-14 12:33:29 +02:00
sessleral71711 730cc895b1 Merge branch 'top_level_design' of https://git.efi.th-nuernberg.de/gitea/kuntzschcl/ESY1_Projekt_2022 into top_level_design 2022-06-14 12:32:53 +02:00
sessleral71711 019dc2868e Added parallelport, timer and ampelsteuerung 2022-06-14 12:26:26 +02:00
sessleral71711 b30efd039d Added bus_if and fsm to top level design 2022-06-14 12:25:53 +02:00
sessleral71711 ecd6f16dbe merge konflikt behoben 2022-06-14 12:25:25 +02:00
sessleral71711 6a72019f25 Initalized top level design 2022-06-14 12:25:19 +02:00
sessleral71711 53868c67fd Added Bus_if and fsm to top level design 2022-06-14 12:22:52 +02:00
sessleral71711 6ab278694e Initalized top level design 2022-06-14 12:22:52 +02:00
sessleral71711 026899b930 Added parallelport, timer and ampelsteuerung 2022-06-14 12:21:25 +02:00
badenbergra78621 9ffb72cf97 Screenshots from RADIANT --> how to create SPI module with radiant 2022-06-14 09:59:23 +00:00
badenbergra78621 72c964475f Screenshots from RADIANT --> how to create SPI module with radiant 2022-06-14 09:58:24 +00:00
sessleral71711 d2aa8277c7 spi_interface dateien 2022-06-14 11:56:42 +02:00
sessleral71711 c93bdaf629 Added bus_if and fsm to top level design 2022-06-14 11:53:20 +02:00
sessleral71711 1be3ce1cea merge konflikt behoben 2022-06-14 11:52:04 +02:00
sessleral71711 4b0451fc63 Merge branch 'top_level_design' of https://git.efi.th-nuernberg.de/gitea/kuntzschcl/ESY1_Projekt_2022 into top_level_design 2022-06-14 11:51:22 +02:00
sessleral71711 20f8e707bd Added Bus_if and fsm to top level design 2022-06-14 11:45:29 +02:00
badenbergra78621 c46a1c3b33 add "spi_interface_portsI()" (beginning of document) 2022-06-14 09:42:25 +00:00
sessleral71711 6b874ba5c7 Initalized top level design 2022-06-14 11:34:24 +02:00
sessleral71711 200a989683 Added modport for timer 2022-06-14 11:23:54 +02:00
sessleral71711 613bffbcfc Added modport in Bus_if for Fsm 2022-06-14 11:03:41 +02:00
reussch78773 19177edb3f Merge branch 'main' of https://git.efi.th-nuernberg.de/gitea/kuntzschcl/ESY1_Projekt_2022 2022-06-14 11:01:22 +02:00
reussch78773 0ecac8324e Timer and Port source 2022-06-14 11:00:38 +02:00
sessleral71711 b8d834144b Initalized top level design 2022-06-14 10:35:05 +02:00
16 changed files with 1391 additions and 947 deletions

No files matched your search

+24 -1
View File
@@ -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
+2 -3
View File
@@ -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;
+69
View File
@@ -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
+128
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
`include "Top.sv"
module tb_Top;
endmodule
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

File diff suppressed because it is too large. Load diff
+87
View File
@@ -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
+98
View File
@@ -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