|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上寻找数字地与模拟地的英文材料;# E, N! k, T3 a( B) J5 Y% m
无意间浏览到一个国外的的cpld/FPGA论坛,点击进入0 g* Q# X M$ `
发现了有人求51的IP CORE,在回帖里面看到这个,所以下载了。* N1 u7 B& B! ]) V! Q
% [& M- [; Q6 Y; B
. l$ h' A4 g0 n1 A$ T@: mc8051@oregano.at. [( O1 D* B0 \9 i2 X) J
W: http://oregano.at/ip/8051.htm9 C' W7 v. Q* Z
( h; j. \+ @, Y( a7 G$ C
************************************************************
) o* X9 R3 _9 M& j( @- TThis is version 1.4 of the MC8051 IP core.# h) y2 @- J) p; O6 i9 h: ? ?
November 2004: Oregano Systems - Design & Consulting GesmbH/ h2 R6 {; [8 M5 X) k( B8 e5 F
============================================================
, v" i3 s1 Y1 I/ KChanges:
& K% ` U% M& @* \! g# a- corrected behaviour of RETI instruction handling
/ v$ ? ]* \. a0 S! z3 H/ c3 M- added synchronization for interrupt signals& u0 R$ L- g- b7 q
- corrected timer problems- m; l# b; ^" B: t% _: }
& `5 L% U: r1 _- \/ \& ^
************************************************************8 N5 j" m4 @- Q# h
This is version 1.3 of the MC8051 IP core.
1 q9 b1 v% e% S B1 @/ ~2 ?; lSeptember 2002: Oregano Systems - Design & Consulting GesmbH
" d" l" k" z7 V2 X============================================================
( ~6 h" x7 g! C( l, ]Change history:! r4 a: `- q. c* i; f
- Improved tb_mc8051_siu_sim.vhd to verify duplex operation.
+ o* P' l1 e$ Y- Corrected problem with duplex operation in file
3 y5 v% P/ ]4 x+ s mc8051_siu_rtl.vhd6 b; t) ~- r/ y' W' a
* G. V& F7 O9 o************************************************************! E# B. Z# e9 j# B# b
This is version 1.2. of the MC8051 IP core.
& K6 ^: G1 d5 V8 Y6 ?6 U" VJune 2002 - Oregano Systems - Design & Consulting GesmbH
; n2 o& O0 M$ |============================================================) N) b2 M& n7 K& U1 x& @) [
Change history:' X9 m1 [/ e' j
- Eliminated the scr subdirectory form the distribution.; G% P: J: V/ R1 O. F) l
- Improved documentation.
# c6 T) k/ F9 G- r ]- Corrected several bugs in the source code (see the
8 _) y. Q- b1 i e; p9 M. G website for more details).
3 T' W( J) w0 A; s) v/ F- Improved the testbench with respect to the I/O port
& }9 ^+ I- P0 ]) L behavior.& k) G( A( `4 _) P( P' A: M
- Enriched the msim directory with the assembler source5 e+ K# p: c+ ]% V3 i5 C3 B; i
code of an example program.
0 k* T3 `" a( U/ \0 `5 S- Provided the source code of a Intel hex to binary$ z/ N+ d5 ^3 c2 V
textfile converter to ease simulation of the user's% D6 X8 P4 ^/ S3 v5 w
assambler programs.- u! a7 A& b, S1 j
, j, _. o! M7 E3 I6 Q************************************************************: B3 A! j9 r% U" j; R
This is version 1.1. of the MC8051 IP core.3 i) m3 f& _2 ?
Jan 31st 2002 - Oregano Systems - Design & Consulting GesmbH! s) `2 x6 T: l( E4 h1 f4 U8 _8 u
. E/ v5 E( d8 u+ _5 x
V; `% x5 Q. |- G7 i8 T
2 c8 @6 m: m& V' f' q- H. V0 p# C下面是里面的部分VHDL+ ~- U6 |- x, C' x) A
8 l1 u- X2 z; N- I& G j: p p* \
2 T% b7 M; i @8 A' slibrary IEEE;
* _" I- U1 J8 Q( H( `use IEEE.std_logic_1164.all; . Y' f X/ H: a( A5 w/ @
use IEEE.std_logic_arith.all;- w$ ~2 I) U9 S) J, q9 Q3 D3 |" w% N
library work;
) y$ B5 r- Q% S! k& f$ e0 ~use work.mc8051_p.all;: \0 N9 X7 N/ A& B
# [3 t; B0 [0 H& @5 U# G9 y( p-----------------------------ENTITY DECLARATION--------------------------------3 P/ l2 _$ h; i3 T2 z
entity addsub_core is
6 i6 Z% z* e6 n7 f) A9 M 8 {! W8 O* t" f. z; |4 u
generic (DWIDTH : integer := 16); -- Data width of the ALU
' W' Y* l2 G. {2 L+ a& [7 N1 { port (opa_i : in std_logic_vector(DWIDTH-1 downto 0);
& o9 w& [7 _0 @9 `1 I" v opb_i : in std_logic_vector(DWIDTH-1 downto 0);
8 M# c2 I6 p9 I9 C addsub_i : in std_logic;
# |* X* D3 X% W+ q5 Y cy_i : in std_logic;
1 D+ F9 F; M# W0 F0 y6 t cy_o : out std_logic_vector((DWIDTH-1)/4 downto 0);
5 u: j3 y; a; }5 S, [8 s+ R ov_o : out std_logic;
& _: Y7 U" }+ J rslt_o : out std_logic_vector(DWIDTH-1 downto 0));% m4 ]6 l6 i' K0 Z
* N h" @/ X& z; [; G) ?
end addsub_core;/ t1 P% A5 L! S
. r3 y; T+ y1 }9 y( q
" w: v5 `2 ?$ s- [4 B# q
1 J0 n" y0 _% Z6 ?) Z1 oentity mc8051_alu is
5 o U" X9 J% W' t1 E0 h: { generic (DWIDTH : integer := 8); -- Data width of the ALU7 W& P; b6 ]$ i$ {
port (rom_data_i : in std_logic_vector(DWIDTH-1 downto 0);
, D0 v D) d' K+ Z( L) ] ram_data_i : in std_logic_vector(DWIDTH-1 downto 0);" b6 I8 O1 ~, G! M7 A6 v
acc_i : in std_logic_vector(DWIDTH-1 downto 0);0 v+ Y' n+ ~7 |5 t4 w
cmd_i : in std_logic_vector(5 downto 0);
5 R) y) w3 ^6 S4 l* { cy_i : in std_logic_vector((DWIDTH-1)/4 downto 0);- p" `8 S* g6 | X |
ov_i : in std_logic;
: _) |" Z2 Z- t$ G% R 5 A: a M6 J& E* c- |% x1 f8 s- g
new_cy_o : out std_logic_vector((DWIDTH-1)/4 downto 0);1 K, X. s7 B% x) q$ I
new_ov_o : out std_logic;
) q8 ?3 ~5 r/ ^. f result_a_o : out std_logic_vector(DWIDTH-1 downto 0);8 J, K8 X7 R$ _4 B4 Y d( i
result_b_o : out std_logic_vector(DWIDTH-1 downto 0));
/ z& T j7 x* T; b9 I! E# {* B2 K ; I [% `/ m3 h8 T6 F
end mc8051_alu;
7 d% s, c* }1 y* t7 U$ }3 |$ @4 [- `--Inputs:4 y2 g$ p; R% ]) E
-- rom_data_i...... data input from ROM# Y; K8 }0 h5 {
-- ram_data_i...... data input from RAM* Y: l+ |4 [" `6 p+ Y$ j
-- acc_i........... the contents of the accumulator register1 |/ \- z3 L. R
-- cmd_i........... command from the control unit
+ i$ i4 n1 d9 A2 C* j' l8 [/ U: @-- cy_i............ CY-Flags of the SFR
" o$ o+ n3 G: ]9 P; R7 F-- ov_i............ OV-Flag of the SFR
L! [$ f! b7 o--Outputs:
0 X( @8 S8 A% C, w5 l% _-- new_cy_o........ new CY-Flags for SFR
/ m/ Y y3 ~+ |6 S$ \+ r-- new_ov_o........ new OV-Flag for SFR! d! U$ |7 J+ h* _2 n! V
-- result_a_o...... result
8 G: y3 }) p3 X' C+ x-- result_b_o...... result
4 }: n( o) a. I) U. T- v' i: v) i
- J1 [# }! B4 R2 W: w% b# R4 p9 r
! o6 F. e! K4 t! C/ e0 P
& c/ T3 {8 l$ e% h K7 j
( j2 w7 B8 N9 I& Y" m* d1 karchitecture struc of mc8051_alu is
: o1 \/ Z- j1 X5 D( t signal s_alu_result : std_logic_vector(DWIDTH-1 downto 0);
5 b* O% V0 w& V) y( o2 H& M ] signal s_alu_new_cy : std_logic_vector((DWIDTH-1)/4 downto 0);
# ]7 k( E5 q+ m- j w signal s_alu_op_a : std_logic_vector(DWIDTH-1 downto 0);
/ M5 p" K; e9 ?+ ~' w signal s_alu_op_b : std_logic_vector(DWIDTH-1 downto 0);
: q6 ~7 a1 w1 e: T) t+ H+ x signal s_alu_cmd : std_logic_vector(3 downto 0);" y" b7 I7 G6 n' |9 M8 W
signal s_dvdnd : std_logic_vector(DWIDTH-1 downto 0);. _6 z: V- l2 X
signal s_dvsor : std_logic_vector(DWIDTH-1 downto 0);. i/ f; t$ K+ E% M' O
signal s_qutnt : std_logic_vector(DWIDTH-1 downto 0);
9 c, r5 h1 a! @$ k: K3 o signal s_rmndr : std_logic_vector(DWIDTH-1 downto 0);
2 W3 S/ `$ C% a( t0 F6 O3 h P signal s_mltplcnd : std_logic_vector(DWIDTH-1 downto 0);+ b! D; ]* i/ }3 H
signal s_mltplctr : std_logic_vector(DWIDTH-1 downto 0);8 O: u# }- @, p6 N9 K6 ]
signal s_product : std_logic_vector((DWIDTH*2)-1 downto 0);- W( }6 f4 q9 V* d- b
signal s_dcml_data : std_logic_vector(DWIDTH-1 downto 0);0 ?+ C/ }8 S) U U H
signal s_dcml_rslt : std_logic_vector(DWIDTH-1 downto 0);
6 S6 i2 d0 J1 d4 ~1 T2 f0 q, | signal s_dcml_cy : std_logic;
* q. ~8 n- l* H/ R signal s_addsub_rslt : std_logic_vector(DWIDTH-1 downto 0);
$ c0 `/ a, \+ o5 E4 R signal s_addsub_newcy : std_logic_vector((DWIDTH-1)/4 downto 0);
% t5 e! p6 o! V' o8 | signal s_addsub_ov : std_logic;. `) e5 c5 E2 K
signal s_addsub_cy : std_logic;
; Z9 ?2 O8 U! f, B# n signal s_addsub : std_logic;/ Q% \# n+ e% ~+ u& Y
signal s_addsub_opa : std_logic_vector(DWIDTH-1 downto 0);
( P a+ m$ P2 k' O5 P signal s_addsub_opb : std_logic_vector(DWIDTH-1 downto 0);
/ R3 I5 F. ~' D6 X+ I7 B+ Z1 mbegin -- architecture structural3 k7 i7 N4 c/ p3 s$ `7 @+ k7 x
i_alumux : alumux
7 W$ j& t$ M% q& a/ f0 U ` generic map (' v) }8 @- ]9 ^
DWIDTH => DWIDTH)& F+ t, d* D2 F/ W
port map (
$ y u1 g" p2 ~# [) S* S6 R -- Primary I/Os of the ALU unit.
3 @8 C- j' \. f. A7 u rom_data_i => rom_data_i,
/ H! w, V3 }$ C- w9 J& p' P ram_data_i => ram_data_i,
5 Z* A, h$ b$ B' `6 {: Q0 `# [: ]* z acc_i => acc_i,
) B2 z& z2 ^8 ?+ @. Z) d cmd_i => cmd_i,* `; E( O, z" z# h: k! A
cy_i => cy_i,
& n6 P/ o3 R- ~+ H- h7 Y% Z7 ?9 f' T, M ov_i => ov_i,7 o$ P3 M) A- K7 D. }
cy_o => new_cy_o,
% [5 C6 n) W$ @9 e) j6 Y ov_o => new_ov_o,
# A( V# v% E7 v. m+ a z! X$ x result_a_o => result_a_o,
( r' y: [' ?; X( |$ ~ result_b_o => result_b_o,
1 a8 e- z; Z) v0 C! U9 T; v -- I/Os connecting the submodules.
$ }2 |# C, `, W( C- i6 W. e result_i => s_alu_result,
) e7 O( z$ g1 M; w# B0 @ new_cy_i => s_alu_new_cy,9 Y3 F$ ?/ F, v. t. C1 [
addsub_rslt_i => s_addsub_rslt,
5 O( @* n4 {" N5 q& }9 O addsub_cy_i => s_addsub_newcy,4 U6 V- e. H: E3 D
addsub_ov_i => s_addsub_ov,
! r: X$ @& E( W3 z d, D op_a_o => s_alu_op_a,1 O" g/ w0 D: i# T3 Z
op_b_o => s_alu_op_b,
~1 N0 \ C! J alu_cmd_o => s_alu_cmd,
5 S6 Y) r; l! m T opa_o => s_addsub_opa,3 p6 ]1 z: S; i& M' Y, l; {% F
opb_o => s_addsub_opb,( b1 [9 t2 C+ k& e: a
addsub_o => s_addsub,) j8 J2 O y. P- C8 R z
addsub_cy_o => s_addsub_cy,
/ d, B/ b, f. M0 |, Z9 l dvdnd_o => s_dvdnd,& y% A+ g& ]) Q
dvsor_o => s_dvsor,
# ]2 @3 O5 J( d0 B' G qutnt_i => s_qutnt,
2 U9 k# ?- d1 g' c4 y rmndr_i => s_rmndr,# P. b, y' ]8 M' U8 I1 V
mltplcnd_o => s_mltplcnd,3 c: [. u- Z& w5 T
mltplctr_o => s_mltplctr,
4 u s6 E. W% o product_i => s_product, d' ~2 Y" r' {* `( `; y0 X
dcml_data_o => s_dcml_data,. U4 I9 T" @: Y6 a
dcml_data_i => s_dcml_rslt,
5 c$ \9 d( M/ j* I% s; O7 U1 b dcml_cy_i => s_dcml_cy);
6 J. Q5 `3 S( S3 |5 H i_alucore : alucore
1 z7 c6 f, V: b' w' g generic map (: O `. W/ x5 B% k h
DWIDTH => DWIDTH)! [: z( W! C+ o
port map (: l" m% Y; N4 b
op_a_i => s_alu_op_a,. o( v& _* H8 |5 r" B- R7 C/ `
op_b_i => s_alu_op_b,
) v! t" ? c+ k" \" A5 D alu_cmd_i => s_alu_cmd,
" _4 r0 r! w* F1 w cy_i => cy_i,
, s! g- z8 L, p6 G# z cy_o => s_alu_new_cy,
9 g" t3 B$ [0 S- ?7 ^# F result_o => s_alu_result);6 m( q/ c6 x( y8 {7 f
i_addsub_core : addsub_core
* D' t0 r/ M% \; }/ q; a generic map (DWIDTH => DWIDTH)8 n" i" }4 W5 H
port map (opa_i => s_addsub_opa,
6 X' ~+ n8 Q$ V' L4 s opb_i => s_addsub_opb,5 S7 A# }9 a4 E! ^ G, }
addsub_i => s_addsub,
7 y4 t8 L8 Z1 _2 [ cy_i => s_addsub_cy, R3 y; h V! @0 L% z; m
cy_o => s_addsub_newcy,
$ t- P- z2 Q+ n8 v8 Q, L ov_o => s_addsub_ov,
: N: \9 v2 t# U Y. }" V' Q" Q I* R rslt_o => s_addsub_rslt);* q5 J5 v3 G; d" q
gen_multiplier1 : if C_IMPL_MUL = 1 generate
" A) ?. X& g$ ?5 x i_comb_mltplr : comb_mltplr
3 A- p* b4 r: H2 H generic map (5 C- x% h' d6 o$ R, b, v3 Q
DWIDTH => DWIDTH)8 Z' [2 Y7 |1 B2 v) Q' ]
port map (! f* r, U5 {9 f. A. L6 _8 g% h" J! \
mltplcnd_i => s_mltplcnd,
5 X& X: V& p! T+ g O* }$ F mltplctr_i => s_mltplctr,5 \" T/ ?& Y3 E
product_o => s_product);
: b0 g4 N' H' a end generate gen_multiplier1;
# I6 E$ g: s4 T: Q gen_multiplier0 : if C_IMPL_MUL /= 1 generate
1 r% w9 n* r! {- ` s_product <= (others => '0');
. a4 a& n& t( V" y6 U1 \1 D end generate gen_multiplier0;
" k( U4 q7 @. x+ z, u: m9 F gen_divider1 : if C_IMPL_DIV = 1 generate% o6 g, p% q2 F
i_comb_divider : comb_divider
$ G% s: }4 \% B ~. i* L/ i8 Z# { generic map (
: U9 t: d# u# t: v2 H+ S: X DWIDTH => DWIDTH)( x/ |% U2 ~3 u$ L: F: \1 A
port map (
( |2 U; a& c/ ^' t/ p2 L) v4 N& E dvdnd_i => s_dvdnd,
3 R: _! o2 [, m* T dvsor_i => s_dvsor,
) i" }3 \( h/ t qutnt_o => s_qutnt,
# C, W' f2 r2 {- W3 m+ e$ Q rmndr_o => s_rmndr);9 Z' R1 @! ^, u& _6 b
end generate gen_divider1;
0 ~9 V" I/ U8 b0 f gen_divider0 : if C_IMPL_DIV /= 1 generate K, ~* w* M' v$ C
s_qutnt <= (others => '0');, |& V: i' E! a
s_rmndr <= (others => '0');
( x0 q0 _/ n/ s8 i" M end generate gen_divider0;: U; [& f" g' K( C; P- R
gen_dcml_adj1 : if C_IMPL_DA = 1 generate: j) H$ h4 n& W3 a+ J9 O& }
i_dcml_adjust : dcml_adjust4 |0 V% i% b5 g( r
generic map (
' W! y x% P4 J7 t7 w, P DWIDTH => DWIDTH)
1 Y1 w9 _: s" k. @0 m port map (" e' ]$ o: \6 x
data_i => s_dcml_data,
6 k/ m; u1 C1 d& Y" [( j cy_i => cy_i,
8 ~% ^: y! j' m9 A8 x; y. z% b& |, F data_o => s_dcml_rslt,) c7 ~2 N( X0 z5 t3 G4 d! M
cy_o => s_dcml_cy);
0 r/ V0 m' l" m+ V. n) i0 h0 p# k end generate gen_dcml_adj1;
/ W6 m) q2 ^4 u7 ]" a1 C. _ gen_dcml_adj0 : if C_IMPL_DA /= 1 generate( s# Y/ ~& I) u# f! \* Z# a
s_dcml_rslt <= (others => '0');
6 g0 }! w" |: V6 r6 Q6 A' Y* r s_dcml_cy <= '0';
; N3 H$ Y+ C& p5 t9 u end generate gen_dcml_adj0;& f, I; ?2 S( `! }# t- f
end struc; |
|