From 7a5b74318bcc702f114c99b53135dec67022c9bb Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sat, 22 May 2010 09:39:52 +0200 Subject: [PATCH] scanner: beh- und post-tb angepasst --- quartus/project_scanner.tcl | 50 ++++++ sim/screenshots/post_scanner.png | Bin 0 -> 65644 bytes src/TODO | 1 + src/beh_scanner_tb.vhd | 16 +- src/post_scanner_tb.do | 23 +++ src/post_scanner_tb.vhd | 276 +++++++++++++++++++++++++++++++ 6 files changed, 360 insertions(+), 6 deletions(-) create mode 100644 quartus/project_scanner.tcl create mode 100644 sim/screenshots/post_scanner.png create mode 100644 src/post_scanner_tb.do create mode 100644 src/post_scanner_tb.vhd diff --git a/quartus/project_scanner.tcl b/quartus/project_scanner.tcl new file mode 100644 index 0000000..44d9833 --- /dev/null +++ b/quartus/project_scanner.tcl @@ -0,0 +1,50 @@ +package require ::quartus::project + +set need_to_close_project 0 +set make_assignments 1 + +# Check that the right project is open +if {[is_project_open]} { + if {[string compare $quartus(project) "calc"]} { + puts "Project calc is not open" + set make_assignments 0 + } +} else { + # Only open if not already open + if {[project_exists calc]} { + project_open -revision calc calc + } else { + project_new -revision calc calc + } + set need_to_close_project 1 +} + +# Make assignments +if {$make_assignments} { + set_global_assignment -name FAMILY Stratix + set_global_assignment -name DEVICE %DEVICE% + set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim (VHDL)" + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga + set_global_assignment -name MISC_FILE "calc.dpf" + set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH WEAK PULL-UP" + set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "AS INPUT TRI-STATED" + + set_global_assignment -name TOP_LEVEL_ENTITY scanner + set_global_assignment -name VHDL_FILE ../../src/gen_pkg.vhd + set_global_assignment -name VHDL_FILE ../../src/math_pkg.vhd + set_global_assignment -name VHDL_FILE ../../src/scanner.vhd + + #pin mapping/system + set_location_assignment PIN_N3 -to sys_clk + set_location_assignment PIN_AF17 -to sys_res_n + + # Commit assignments + export_assignments + + # Close project + if {$need_to_close_project} { + project_close + } +} diff --git a/sim/screenshots/post_scanner.png b/sim/screenshots/post_scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..5b66f90b766236c3c5261ceb85a73dd3c9381b89 GIT binary patch literal 65644 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

OT?#ssNw9YnKSB?F{TMDWoBG|3fLH ze8C0@UHxaC*Z+wx0oWE6-mqb=HUgXF5VT;lxgpGWaNc%w{}Gg_IHLpHu)4;gYek_F zV|zryYiImiw}uo1s(O)^NT618b^XL3l2aAuB>%`R2hC&N;g_HWhe$s4VO%Z)0jW0rbHuLmRnI@(HAvvv zu`*5Zufg&E(HH3KBX1{-mL*do69d&5d}TN-75+`PM46tTgjZa6G&_r?L%5>X54z}`q8 zeBJx=#teaHV7~pp0oDwL5VZ9#KwG}J#m99J`3ta%*!lt;g5adz+Af9M2QXm#i%gwU zLp=6cnaV*q@-y|+b=TDhq!tDjv|f3!k<^^N!zCQpON6w!g5{FQW@W>tSm88w=qg^= z+kcGYgisWoXIz&U)a0ve&|g!|ZvB~uR%10c9H+%wS!>kd-Qlk80X~juZNT2jmUEVc z)NHMjk*ZIN()yq4#_o!xCtJWdg)VMAXEqJLVU25IUjB&uDyOFnd;7KWt-aOO$Gg+sEPr+B*0x(l-;*v?t@$=@ z>-i4ldEiRc#{2#Ir1No=v#rg3Rezm$zf}J3?zcgeTRS&R{kZ4xoC*6^&0d_|!~Jvh z=bEz;Cd&8qG9tg#eeJvT``Xco(R;6bId1l_YMT6U!MKrglg2cQ<*ny3*LX8IQ5|Ja~aX|7iWA`x%*D!yz#T|88TYw>12lY@qq=r|-UZ|C##ds_-A+ z74+-p*Zq3=_2w)Y+>5f4;e!IRBO`|l<1HI%L`nDXdi&~sh4>e{Mnhx>|;g`eH66!i4U zxrIOOZM{9SXNu)(`L~hho9=8rX#>hY3h7VEZ&vRQkNf!hpu`!(w@>W9MmG^(*)~Eli+c)jLb=UKIGC#jwkC(TW@2SrEAG<blXX^ttpTf_GsMl@R7qm43N;m9WWeYNoA*S=bqOrHu$K8Mb zXxcQ?PXLKEEdIH7aRt-cqR#u*U#mhd!el5YU3%pG>!}sb-}Br5Q79@XgqAn`_kTD3 zWT^J)y#IFYeuO`ipmjlkp(#)%{UoG;%+SF81L)oL|9{T^F9=y{$j~7D+n(*4>v6^% Rjo_;xJYD@<);T3K0RREO* data <= ascii2sc(x"1c"); -- $ (enter) when '!' => data <= ascii2sc(x"0e"); -- ! (backspace) + when '/' => + data <= x"e0"; + icwait(sys_clk, 1); + new_data <= '0'; + icwait(sys_clk, 1); + new_data <= '1'; + data <= SC_KP_DIV; when others => data <= ascii2sc(std_logic_vector(to_unsigned(character'pos(input(j)),8))); end case; icwait(sys_clk, 1); new_data <= '0'; - -- ack'en skippen, falls es ein "spezielles" zeichen ist (steht - -- in abhaengigkeit zum vorherigen zeichen) - if(not valid_char(data, last)) then + -- ack'en skippen, falls es ein "spezielles" zeichen ist + if(not valid_char(data)) then next mainl; end if; diff --git a/src/post_scanner_tb.do b/src/post_scanner_tb.do new file mode 100644 index 0000000..04e2a65 --- /dev/null +++ b/src/post_scanner_tb.do @@ -0,0 +1,23 @@ +#alias fuer simulation neustarten +alias rr "restart -f" + +#signale hinzufuegen +add wave sys_clk +add wave sys_res_n +add wave new_data +add wave data +add wave s_char +add wave s_take +add wave s_done +add wave s_backspace +add wave do_it +add wave finished + +#rauszoomen +wave zoomout 500.0 + +#simulation starten und 100ms lang laufen lassen (wird durch assert abgebrochen) +run -all + +#ganz nach links scrollen +wave seetime 0 diff --git a/src/post_scanner_tb.vhd b/src/post_scanner_tb.vhd new file mode 100644 index 0000000..0a1ff83 --- /dev/null +++ b/src/post_scanner_tb.vhd @@ -0,0 +1,276 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.gen_pkg.all; + +entity post_scanner_tb is +end entity post_scanner_tb; + +architecture sim of post_scanner_tb is + component scanner is + port ( + sys_clk : in std_logic; + sys_res_n : in std_logic; + -- PS/2 + new_data : in std_logic; + data : in std_logic_vector(7 downto 0); + -- History + s_char : out hbyte; + s_take : out std_logic; + s_done : in std_logic; + s_backspace : out std_logic; + -- Parser + do_it : out std_logic; + finished : in std_logic + ); + end component scanner; + -- system + signal sys_clk, sys_res_n : std_logic; + -- ps/2 + signal new_data : std_logic; + signal data : std_logic_vector(7 downto 0); + -- history + signal s_char : hbyte; + signal s_take, s_done, s_backspace : std_logic; + -- parser + signal do_it : std_logic; + signal finished : std_logic; + + signal stop : boolean := false; +begin + inst : scanner + port map ( + sys_clk => sys_clk, + sys_res_n => sys_res_n, + -- ps/2 + new_data => new_data, + data => data, + -- history + s_char => s_char, + s_take => s_take, + s_done => s_done, + s_backspace => s_backspace, + -- Parser + do_it => do_it, + finished => finished + ); + + process + begin + sys_clk <= '0'; + wait for 15 ns; + sys_clk <= '1'; + wait for 15 ns; + if stop = true then + wait; + end if; + end process; + + process + function ascii2sc (x : hbyte) return hbyte is + variable y : hbyte; + begin + case x is + when x"30" => y := SC_KP_0; + when x"31" => y := SC_KP_1; + when x"32" => y := SC_KP_2; + when x"33" => y := SC_KP_3; + when x"34" => y := SC_KP_4; + when x"35" => y := SC_KP_5; + when x"36" => y := SC_KP_6; + when x"37" => y := SC_KP_7; + when x"38" => y := SC_KP_8; + when x"39" => y := SC_KP_9; + when x"2b" => y := SC_KP_PLUS; + when x"2d" => y := SC_KP_MINUS; + when x"2a" => y := SC_KP_MUL; + when x"2f" => y := SC_KP_DIV; + when x"20" => y := SC_SPACE; + when x"1c" => y := SC_ENTER; + when x"0e" => y := SC_BKSP; + when others => y := x"41"; + end case; + return y; + end function; + + function valid_char (x : std_logic_vector(7 downto 0)) return boolean is + variable y : boolean; + begin + case x is + when SC_KP_0 | SC_KP_1 | SC_KP_2 | SC_KP_3 | + SC_KP_4 | SC_KP_5 | SC_KP_6 | SC_KP_7 | + SC_KP_8 | SC_KP_9 | SC_KP_PLUS | + SC_KP_MINUS | SC_KP_MUL | + SC_KP_DIV | SC_SPACE | + SC_BKSP | SC_ENTER => + y := true; + when others => y := false; + end case; + return y; + end function; + + -- textio stuff + use std.textio.all; + file f : text open read_mode is "../../src/scanner.test"; + variable l : line; + + variable input : hstring; + variable expectedresult : hstring; + variable realresult : hstring; + + variable checkall : boolean := true; + variable run_tc, run_inner : boolean := true; + variable i, j, k, y : natural; + begin + -- init & reset + sys_res_n <= '0'; + new_data <= '0'; + data <= (others => '0'); + s_done <= '0'; + finished <= '0'; + + icwait(sys_clk, 5); + sys_res_n <= '1'; + + i := 1; + f_loop : while not endfile(f) loop + data <= (others => '0'); + realresult := (others => nul); + + f1_loop : while not endfile(f) loop + readline (f, l); + input := (others => nul); + if (l'length <= 72) then + input(1 to l'length) := l.all; + if (input(1) = '#') then + next f1_loop; + else + exit f1_loop; + end if; + else + report "fehler in scanner.test: eingabe zu lange in testfall " & natural'image(i); + next f_loop; + end if; + end loop f1_loop; + + f2_loop : while not endfile(f) loop + readline (f, l); + expectedresult := (others => nul); + if (l'length <= 72) then + expectedresult(1 to l'length) := l.all; + if (expectedresult(1) = '#') then + next f2_loop; + else + y := l'length; + exit f2_loop; + end if; + else + report "fehler in scanner.test: eingabe zu lange in testfall " & natural'image(i); + next f_loop; + end if; + end loop f2_loop; + + + + report "testcase(" & natural'image(i) & ").input: " & input; + report "testcase(" & natural'image(i) & ").expectedresult: " & expectedresult; + i := i + 1; + + icwait(sys_clk, 5); + run_tc := true; + j := 0; k := 1; + + mainl : while run_tc loop + icwait(sys_clk, 1); + j := j + 1; + + if j = 73 then + run_tc := false; + assert(false) report "wtf @ schleife"; + next mainl; + end if; + + new_data <= '1'; + + case input(j) is + when nul => data <= ascii2sc(x"1c"); -- $ (enter) + when '!' => data <= ascii2sc(x"0e"); -- ! (backspace) + when '/' => + data <= x"e0"; + icwait(sys_clk, 1); + new_data <= '0'; + icwait(sys_clk, 1); + new_data <= '1'; + data <= SC_KP_DIV; + when others => data <= ascii2sc(std_logic_vector(to_unsigned(character'pos(input(j)),8))); + end case; + icwait(sys_clk, 1); + new_data <= '0'; + + -- ack'en skippen, falls es ein "spezielles" zeichen ist + if(not valid_char(data)) then + next mainl; + end if; + + -- wuenschswert waere das hier: + -- > wait on s_backspace, s_take, do_it; + -- geht aber leider nicht, weil sich die signale vllt schon + -- geaendert haben + run_inner := true; + main_inner : while run_inner loop + icwait(sys_clk, 1); + + run_inner := false; + if s_backspace = '1' then + if k > 1 then + realresult(k) := nul; + k := k - 1; + realresult(k) := nul; + end if; + icwait(sys_clk, 1); + s_done <= '1'; + wait on s_take; -- = '0' + icwait(sys_clk, 1); + s_done <= '0'; + elsif do_it = '1' then + -- dauert normalweiser noch laenger (parser braucht + -- relativ lange) + icwait(sys_clk, 7); + finished <= '1'; + wait on do_it; -- = '0' + icwait(sys_clk, 1); + finished <= '0'; + + run_tc := false; + elsif s_take = '1' then + realresult(k) := character'val(to_integer(unsigned(s_char))); + k := k + 1; + + icwait(sys_clk, 1); + s_done <= '1'; + wait on s_take; -- = '0' + icwait(sys_clk, 1); + s_done <= '0'; + else + -- assert(false) report "scanner_tb: kann passieren. wenn tb haengt, dann hier auskommentieren"; + run_inner := true; + end if; + end loop; + end loop; + + report "realresult : " & realresult; + if realresult /= expectedresult then + checkall := false; + end if; + report "=================="; + end loop f_loop; + + if checkall then + report "alle testfaelle des Scanners waren erfolgreich!"; + else + report "nicht alle testfaelle des Scanners waren erfolgreich!"; + end if; + stop <= true; + wait; + end process; +end architecture sim; -- 2.25.1