atas / bawah meja abu

H

heastone

Guest
Bagaimana saya bisa melaksanakan atas / bawah meja abu-abu dengan VHDL?
kecuali biner bertentangan dengan abu-abu counnter

 
Lihat ini (dalam Verilog, Anda dapat mengkonversi untuk VHDL dengan X-HDL):
http://klabs.org/richcontent/software_content/ip/ip.htm

Anda dapat menggunakan pendekatan Machine Negara jika lebar counter kecil

 
Verilog file dari:
http://klabs.org/richcontent/software_content/ip/dane/gray_updown.v

***
`skala waktu 1ns/100ps
modul gray_updown (CLK, aclr, ena, naik, gray_code);
Parameter SIZE = 22;
masukan CLK, aclr, ena, naik;
output [SIZE-1: 0] gray_code;
reg [SIZE-1: 0] gray_code, mantel;
integer i, j, k;
selalu @ (posedge CLK atau negedge aclr)
if (aclr == 1'b0) mulai
gray_code <= 0;
akhir
else begin / / sekuensial update
if (ena == 1'b1) begin / / diaktifkan
mantel = 0;
for (i = 0; i <= SIZE-1; i = i 1) begin / / i loop
/
/ / Toggle sedikit jika jumlah bit-bit pada [SIZE-1: i] bahkan
/ / XNOR arus hingga MSB bit bit untuk Count Up, dan
/ / XOR untuk Count Down
/
for (j = i; j <= SIZE-1; j = j 1) mantel = mantel ^ gray_code [j];
if (up == 1'b1) mantel =! mantel ;
/
/ / Disable mantel jika bit yang lebih rendah Toggling
/
for (k = 0; k <= i-1; k = k 1) mantel = mantel & &! mantel [k];
akhir / I loop
/
/ / Toggle MSB jika tidak ada bit-bit yang lebih rendah (kode meliputi kasus bungkus)
/
if (mantel [UKURAN-2: 0] == 0) mantel [UKURAN-1] = 1;
/
/ / Gunakan masker toggle
/
gray_code <= gray_code ^ mantel;
end / / diaktifkan
end / / sekuensial update
endmodule
***

Transleted untuk VHDL dengan perpustakaan menambahkan dan SIZE = 4

***
library IEEE;
menggunakan IEEE.std_logic_1164.all;
menggunakan IEEE.std_logic_unsigned.all;
menggunakan IEEE.std_logic_arith.all;

ENTITY gray_updown IS
GENERIC (
UKURAN: integer: = 4);
PORT (
CLK: IN std_logic;
aclr: IN std_logic;
ena: IN std_logic;
up: IN std_logic;
gray_code: OUT std_logic_vector (SIZE - 1 downto 0));
END ENTITY gray_updown;

ARSITEKTUR diterjemahkan OF gray_updown ISSIGNAL mantel: std_logic_vector (UKURAN - 1 downto 0);
SIGNAL i: integer;
SIGNAL j: integer;
SIGNAL k: integer;
SIGNAL gray_code_xhdl1: std_logic_vector (UKURAN - 1 downto 0);

BEGIN
gray_code <= gray_code_xhdl1;

PROSES (CLK, aclr)
VARIABLE tog_xhdl2: std_logic_vector (UKURAN - 1 downto 0);
BEGIN
IF (aclr = '0 ') THEN
gray_code_xhdl1 <= (OTHERS => '0 ');
ELSIF (clk'EVENT DAN CLK = '1 ') THEN
IF (ena = '1 ') THEN
tog_xhdl2: = (ORANG LAIN => '0 ');
UNTUK i 0 KE DALAM UKURAN - 1 LOOP
UNTUK j i KE DALAM SIZE - 1 LOOP
tog_xhdl2 (i): = tog_xhdl2 (i) XOR gray_code_xhdl1 (j);
END LOOP;
IF (up = '1 ') THEN
tog_xhdl2 (i): = TIDAK tog_xhdl2 (i);
END IF;
UNTUK k 0 UNTUK DI i - 1 LOOP
tog_xhdl2 (i): = tog_xhdl2 (i) DAN TIDAK tog_xhdl2 (k);
END LOOP;
END LOOP;
IF (tog_xhdl2 (UKURAN - 2 downto 0) = "000000000000000000000") MAKA
tog_xhdl2 (SIZE - 1): = '1 ';
END IF;
gray_code_xhdl1 <= gray_code_xhdl1 XOR tog_xhdl2;
END IF;
END IF;
mantel <= tog_xhdl2;
END PROCESS;

ARSITEKTUR END diterjemahkan;
***

VHDL -> EDIF (Synplify Pro) -> Kompilasi, Fitting, Simulasikan (MAX PLUS II)

Fclk = 158 MHz (EPM3032ALC44-4)

It `s benar-benar bekerja

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Dingin" border="0" />
 
VHDL File
----------
Ref: http://www.vhdl-online.de/model_lib_patras/vhdl_sources/counters/counters.htm

- ################################################ ############################
- # Proyek: Leonardo CBT-Kernel #
- # #
- # Nama file: counters.vhd #
- # #
- # Komponen: gudNlr: N-bit abu-abu atas / bawah counter #
- # Dengan beban sinkron dan asinkron reset #
- # #
- # Model: rtl #
- # #
- # Designer: S. Theoharis, N.Zervas #
- # Institute: VLSI Design Lab., University of Patras #
- # Tanggal: 01.05.1999 #
- ################################################ ############################

library IEEE;
menggunakan IEEE.std_logic_1164.all;
menggunakan IEEE.std_logic_arith.ALL;
menggunakan work.useful_functions.ALL;

- GudNlr Entitas Keterangan
gudNlr entitas adalah
generic (N: INTEGER: = 8);
port (
DIN: di unsigned (N-1 downto 0);
DOUT: out unsigned (N-1 downto 0);
CLK, BAWAH, LOAD, R, UP: di std_ulogic;
MK: keluar std_ulogic
)
gudNlr akhir;

- GudNlr Arsitektur Keterangan
arsitektur rtl dari gudNlr adalah
sinyal istate: unsigned (N-1 downto 0);
sinyal count: unsigned (N downto 0);
sinyal load_value: unsigned (N-1 downto 0);
sinyal binary_out: unsigned (N downto 0);
mulai
- Mengkonversi input ke representasi biner
Grey2Bin (DIN, load_value);
count <= ('0 '& istate) "01" ketika ((UP = '1') dan (DOWN = '0 ')) lain
('0 '& Istate) - "01" ketika ((DOWN = '1') dan (UP = '0 ')) lain
('0 '& Istate);

Count_Process: process (CLK, R)
mulai
if (R = '1 ') maka
- Reset event
istate <= (OTHERS => '0 ');
elsif (CLK'event dan (CLK = '1 ') dan (CLK'last_value = '0')) kemudian
if (LOAD = '1 ') maka
- Clocked load event
istate <= load_value;
elsif (UP = '1 ') atau (DOWN = '1') maka
- Clocked menghitung atas / bawah event
istate <= count (N-1 downto 0);
end if;
end if;
proses akhir Count_Process;

- Mengkonversi input ke representasi biner
Bin2Grey (istate, binary_out);

- Menetapkan nilai-nilai output
DOUT <= binary_out (N-1 downto 0);
MK <= '0 'bila (DOWN = '0' dan UP = '0 ')
lain '1 'ketika (DOWN = '1' dan UP = '1 ')
lain tidak masuk hitungan (N) ketika (DOWN = '1 'dan UP = '0')
else count (N);
akhir rtl;

 
Halo,

Aku belajar di FERI (http://www.feri.uni-mb.si/) univirsity elektronik.

Aku harus membangun sebuah meja dengan PAL, yang akan dihitung di Gray kode dari 0 sampai 9.Counter harus memiliki dua inputes, memuat nomor (input LOAD) dan "mulai" atau "ON" (input EN).Ketika counter tidak diperbolehkan masuk dalam negara (9-15), counter harus reset.

Saya menggunakan program ABEL dan aku program simulasi dengan data *. Jed ...

Saya menemukan ini: http://www.asic-world.com/examples/verilog/gray.html tetapi tidak bekerja di program saya ...

Aku membuat counter normal, tapi aku tidak tahu bagaimana untuk membangunnya di Gray kode.Program saya:

MODULE CNT
judul 'stevec gor / dol'
D0 .. D3, URA, terlebih dulu, cnten, ld, u_d pin;
D = [D3, D2, D1, D0];
P3 pin Q0 .. istype'reg ';

Q = [Q3, Q2, Q1, Q0];
X =. X.;
MODE = [cnten, ld, u_d, terlebih dulu];
LOAD = (MODE == [X, 1, X, X]);
HOLD = (MODE == [0,0, X, 0]);
UP = (MODE == [1,0,1,0]);
DOWN = (MODE == [1,0,0,0]);
RESET = (MODE == [X, 0, X, 1]);
persamaan
Q.clk = URA;
KETIKA (LOAD) THEN (KETIKA (D> 9) THEN T: = 9 ELSE T: = D;)
ELSE KETIKA (HOLD) KEMUDIAN T: = Q;
ELSE KETIKA (UP) THEN (KETIKA (Q == 9) THEN T: = 0;
ELSE T: = (Q 1);)
ELSE KETIKA (DOWN) THEN (KETIKA (Q == 0) THEN T: = 9;
ELSE T: = (Q-1);)
ELSE KETIKA (RESET) KEMUDIAN T: = 0;

TEST_VECTORS
([u_d, terlebih dulu, ld, cnten, URA, D3, D2,D1,D0] -> [Q3,Q2,Q1,Q0]) [X, 0,1, X,. C., 0,1,1,1] -> [0,1,1,1]; / / NALO I 7
[1,0,0,1,. C., X, X, X, X] -> [1,0,0,0]; / / TEJ GOR 7NA 8
[1,0,0,1,. C., X, X, X, X] -> [1,0,0,1]; / / TEJ GOR 8NA 9
[1,0,0,1,. C., X, X, X, X] -> [0,0,0,0]; / / TEJ GOR 9NA 0
[1,0,0,1,. C., X, X, X, X] -> [0,0,0,1]; / / TEJ GOR 0NA 1
[X, 1,0, X,. C., X, X, X, X] -> [0,0,0,0]; / / RESET
[X, 0,1, X,. C., 1,1,1,1] -> [1,0,0,1]; / / NALO I 15 DI SPREMENI V 9
[X, 0,1, X,. C., 0,1,1,0] -> [0,1,1,0]; / / NALO I 6
[0,0,0,1,. C., X, X, X, X] -> [0,1,0,1]; / / TEJ DOL IZ 6 NA 5
[X, 0,1, X,. C., 0,0,0,0] -> [0,0,0,0]; / / NALO I 0
[0,0,0,1,. C., X, X, X, X] -> [1,0,0,1]; / / TEJ IZ 0 NA DOL 9
[X, 0,0,0,. C., X, X, X, X] -> [1,0,0,1]; / / HOLD
END

* stevec gor / dol = counter up / down
* 7 na TEJ GOR 8 = menghitung 7-8
* TEJ DOL IZ 6 na 5 = menghitung mundur 6-5

Aku hanya perlu counter di Gray dan hanya untuk menghitung ...Terima kasih atas bantuan Anda!

Simon

 
Tidak ada kode VHDL di sini - tapi akan memberi Anda prinsip.
bagian I:
http://asicdigitaldesign.wordpress.com/2007/05/10/counting-in-gray/

Bagian II:
http://asicdigitaldesign.wordpress.com/2007/05/13/counting-in-gray-part-ii-observations/

Bagian III:
http://asicdigitaldesign.wordpress.com/2007/05/14/counting-in-gray-part-iii-putting-everything-together/

hope this helps:

ND.
http://asicdigitaldesign.wordpress.com/

 

Welcome to EDABoard.com

Sponsor

Back
Top