Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

VHDL / Verilog - model behavioralny

Dann
-
-
Posty:2
Rejestracja:11 cze 2007, o 23:13
Lokalizacja:Zakęcie
VHDL / Verilog - model behavioralny

Postautor: Dann » 12 cze 2007, o 00:23

Witam, potrzebuję pomocy w konwersji kodu z VHDL'a na VERILOGA
układu sn74ls592 : http://focus.ti.com/lit/ds/symlink/sn74ls592.pdf

Oto poprawny kod w VHDL'u:

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ls592 is Port ( DIN : in std_logic_vector(7 downto 0); RCK : in std_logic; CLOAD : in std_logic; CCK : in std_logic; CCKEN : in std_logic; CCLR : in std_logic; RCO : out std_logic); end ls592; architecture Behavioral of ls592 is signal rejestr: std_logic_vector(7 downto 0); signal licznik: std_logic_vector(7 downto 0); begin load_reg: process (RCK,DIN) begin if rising_edge(RCK) then rejestr<=DIN; end if; end process; licz: process (CCK, CCKEN, CCLR, CLOAD) begin if CCLR='0' then licznik<=(others=>'0'); elsif CLOAD='0' then licznik<=rejestr; elsif rising_edge(CCK) then if CCKEN='0' then licznik <= licznik + "00000001"; end if; end if; end process; RCO<='0' when licznik=x"ff" else '1'; end Behavioral;
A oto moje błędne próby przerobienia na Verilog'a:

Kod: Zaznacz cały

module ls592 (DIN, RCK, CLOAD, CCK, CCKEN, CCLR,RCO); input [7:0] DIN; input RCK; input CLOAD; input CCK; input CCKEN; input CCLR; output RCO; wire [7:0] DIN; wire RCK, CLOAD, CCK, CCKEN, CCLR, RCO; reg [7:0] rejestr; reg [7:0] licznik; always @(posedge RCK) rejestr<=DIN; always @(CCK or CCKEN or CCLR or CLOAD) begin CCLR = 1'b0 ? licznik <= 1'b0; else if (CLOAD == 1'b0) licznik<=rejestr; else if (CCK == 1'b1) if (CCKEN == 1'b0) licznik<=licznik+1; end //RCO<='0' when if licznik=x"ff" else '1'; licznik = 8'b11 ? RCO <= 1'b0 : 1'b1; endmodule
Kod nie działa poprawnie, byłbym wdzięczny za jakąkolwiek pomoc

TWl
-
-
Posty:12
Rejestracja:8 lut 2007, o 01:58
Lokalizacja:Warszawa

Re: VHDL / Verilog - model behavioralny

Postautor: TWl » 12 cze 2007, o 18:41

Nie porownywalem dzialania z modelem VHDL, ale powinno byc OK.

Kod: Zaznacz cały

module ls592 ( input [7:0] DIN, input RCK, input CLOAD, input CCK, input CCKEN, input CCLR, output RCO ); reg[7:0] rejestr, licznik; always@(posedge RCK) rejestr<=DIN; always@(posedge CCK or negedge CCLR or negedge CLOAD) if(!CCLR) licznik<=0; else if(!CLOAD) licznik<=rejestr; else licznik<=licznik+1; assign RCO = !(licznik == 8'hff); endmodule

Dann
-
-
Posty:2
Rejestracja:11 cze 2007, o 23:13
Lokalizacja:Zakęcie

Postautor: Dann » 12 cze 2007, o 19:41

Kod działa poprawnie, wszystko jest należycie, jestem wdzięczny za pomoc.

chaku
-
-
Posty:1
Rejestracja:19 cze 2007, o 10:26
Lokalizacja:Cozuchovia

Postautor: chaku » 19 cze 2007, o 10:34

Witam

A ja mam problem z nie kompilującym się kodem w Verilogu czy moze ktoś zobaczyć co jest nie tak:


Poprawiłem troszku kod i juz mam mniej błędów:

Kod: Zaznacz cały

module behavioral (NG, NSRCLR, NSRCKEN, SRCK, NSRLOAD, DS, SER0, SER1, RCK, Q, WYJSCIE,reg1); inout[7:0] Q; input NG,NSRCLR,NSRCKEN,SRCK,NSRLOAD,DS,SER0,SER1,RCK; output WYJSCIE; inout[7:0] reg1; wire[7:0] reg1,Q; reg[7:0] count; wire A,B,C,D,E,F,G,H,NG,NSRCLR,NSRCKEN,SRCK,NSRLOAD,DS,SER0,SER1,RCK; //assign reg1 = reg1?1:0; //assign count[7:0] = count?1:0; always @(NSRLOAD,NSRCLR,SRCK) begin if (NSRCLR==1'b0) count[7:0]<=8'b00000000; else if (NSRLOAD==1'b0) count[7:0]=reg1; else if (( ~NSRCKEN==1'b1) && SRCK==1'b0) count[7:0]<=count[7:0]+1; else if (DS==1'b1) WYJSCIE<=SER1; else if (DS==1'b0) WYJSCIE<=SER0; end always @(negedge RCK) begin if (RCK==1'b0) reg1<=Q; end always @(NG, WYJSCIE) begin if (NG==1'b0) Q<=count[7:0]; else if (count[7:0]==8'b11111111) WYJSCIE=1'b0; end endmodule

oraz takie błędy mi sypie:

Kod: Zaznacz cały

# Error: VCP2858 behavioral.v : (50, 21): WYJSCIE is not a valid left-hand side of a procedural assignment. # Error: VCP2858 behavioral.v : (53, 22): WYJSCIE is not a valid left-hand side of a procedural assignment. # Error: VCP2858 behavioral.v : (59, 12): reg1 is not a valid left-hand side of a procedural assignment. # Error: VCP2858 behavioral.v : (65, 17): Q is not a valid left-hand side of a procedural assignment. # Error: VCP2858 behavioral.v : (68, 16): WYJSCIE is not a valid left-hand side of a procedural assignment.
układ jaki probowałem zaprogramowac to LS598 z tej samej rodziny co kolega wyżej

ziggy
-
-
Posty:25
Rejestracja:2 cze 2006, o 21:44
Lokalizacja:Podkarpacie
Kontaktowanie:

Postautor: ziggy » 19 cze 2007, o 15:59

Nie no, po prostu fatalnie zabierasz się do tematu :611: Mieszasz przypisania blokujące i nieblokujące, opisujesz układ asynchroniczny (podobnie specyfikowane opisy z dużym prawdopodobieństwem, po syntezie i implementacji - nie będą działać), przypisujesz wartości do zmiennych rejestrowych z dwóch różnych bloków sekwencyjnych, redeklarujesz sygnały o tych samych nazwach, stosujesz błędne typy sygnałów w przypisaniach wewnątrz bloku always, oczywiście niepoprawnie obsługujesz porty dwukierunkowe, itp.
Ach ci studenci... :611: :604:
Proponuję poniższy kod (nie symulowałem go, ale powinien działać poprawnie):

Kod: Zaznacz cały

module sn74xx598(input G,SRLOAD,SRCLR,SRCK,SRCKEN,RCK,DS,SER0,SER1, inout [7:0] IO ); reg [7:0] Q1,Q2; wire sin; assign sin=(DS)?SER1:SER0; always @(posedge RCK) Q1<=IO; always @(negedge SRCLR, negedge SRLOAD, posedge SRCK) if(~SRCLR) Q2<=0; else if(~SRLOAD) Q2<=Q1; else if (~SRCKEN) Q2<={Q2[6:0],sin}; generate genvar i; for (i=0;i<8;i=i+1) begin:buffers bufif0 (IO[i],Q2[i],G); end endgenerate endmodule

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości