mọi người ơi,giúp em với:em viết chương trình VHDL về bộ đếm timer.bộ đếm timer em đang viết có 4 đầu vào :clk,start,stop,reset.bộ đếm của em đếm từ 0-9:59.mong mọi người chỉ giúp!!!
Thông báo
Collapse
No announcement yet.
giúp đỡ về timer
Collapse
X
-
em viết chương trình thế này nhưng ko biết viết về stop như thế nào.mọi người xem va chi giúp:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity seven_segdisplay is
Port ( clk : in STD_LOGIC;
rst : in STD_LOGIC;
start : in STD_LOGIC;
stop : in STD_LOGIC;
digits1 : out STD_LOGIC_VECTOR (6 downto 0);
digits2 : out STD_LOGIC_VECTOR (6 downto 0);
digitm : out STD_LOGIC_VECTOR (6 downto 0));
end seven_segdisplay;
architecture Behavioral of seven_segdisplay is
begin
counter: process(clk,rst)
variable temp1 : integer range 0 to 10;
variable temp2 : integer range 0 to 10;
variable temp : integer range 0 to 10;
begin
if (start ='1') then
if (rst='1') then temp1 :=0;
temp2 :=0;
temp :=0;
ELSIF (clk'EVENT AND clk='1') THEN
temp1 := temp1 + 1;
if (temp1=10) then
temp1 := 0;
temp2 := temp2 + 1;
if (temp2=6) then
temp2 := 0;
temp := temp + 1;
if (temp = 10) then
temp :=0;
end if;
end if;
end if;
end if;
end if;
------ BCD to SSD conversion: --------
CASE temp1 IS
WHEN 0 => digits1 <= "1111110"; --7E
WHEN 1 => digits1 <= "0110000"; --30
WHEN 2 => digits1 <= "1101101"; --6D
WHEN 3 => digits1 <= "1111001"; --79
WHEN 4 => digits1 <= "0110011"; --33
WHEN 5 => digits1 <= "1011011"; --5B
WHEN 6 => digits1 <= "1011111"; --5F
WHEN 7 => digits1 <= "1110000"; --70
WHEN 8 => digits1 <= "1111111"; --7F
WHEN 9 => digits1 <= "1111011"; --7B
WHEN OTHERS => NULL;
END CASE;
CASE temp2 IS
WHEN 0 => digits2 <= "1111110"; --7E
WHEN 1 => digits2 <= "0110000"; --30
WHEN 2 => digits2 <= "1101101"; --6D
WHEN 3 => digits2 <= "1111001"; --79
WHEN 4 => digits2 <= "0110011"; --33
WHEN 5 => digits2 <= "1011011"; --5B
WHEN 6 => digits2 <= "1011111"; --5F
WHEN 7 => digits2 <= "1110000"; --70
WHEN 8 => digits2 <= "1111111"; --7F
WHEN 9 => digits2 <= "1111011"; --7B
WHEN OTHERS => NULL;
end case;
CASE temp IS
WHEN 0 => digitm <= "1111110"; --7E
WHEN 1 => digitm <= "0110000"; --30
WHEN 2 => digitm <= "1101101"; --6D
WHEN 3 => digitm <= "1111001"; --79
WHEN 4 => digitm <= "0110011"; --33
WHEN 5 => digitm <= "1011011"; --5B
WHEN 6 => digitm <= "1011111"; --5F
WHEN 7 => digitm <= "1110000"; --70
WHEN 8 => digitm <= "1111111"; --7F
WHEN 9 => digitm <= "1111011"; --7B
WHEN OTHERS => NULL;
END CASE;
END PROCESS counter;
end Behavioral;
-
Bạn nên nói ý tưởng của bạn là stop thế nào.Nếu stop cái tất cả về 0 và khi có start thì đếm lại từ đầu thì đơn giản rồi.nếu có stop tất cả ngừng đếm nhưng giữ nguyên trạng thái đầu ra và chờ khi có start thì đếm tiếp thì cũng ko khó.mình sẽ nói về trường hợp thứ 2 Vì bạn cho start như là một switch bằng lệnh IF và ý tưởng của bạn là nếu start = 1 thì thực hiện các lệnh sau "then" nhưng mình hỏi bạn rằng khi start = 0 thì sẽ như thế nào?Khi start = 0 thì tất cả cái lệnh sau "IF start = 1 then" sẽ không thực hiện nữa (trường hợp này ko có yêu cầu gì cho FPGA thực hiện tương đương với 1 thanh ghi nhớ trạng thái) như vậy đầu ra sẽ giữ nguyên trạng thái như trước khi có start = 0.Vậy không cần phải tạo thêm đầu vào stop làm gì nữa.mà ở đây có thể hiểu là khi start = 1 thì đếm còn khi start = 0 thì ngừng đếm và chỉ đếm tiếp khi nào có start=1.
Trong lập trình người ta thường sử dụng các tín hiệu điều khiển đó là clk, reset,CE(chip enable),stop/start(chung 1 đầu vào để tiết kiệm trạng thái) và một số điều khiển khác ứng dụng riêng. Với start/stop thì có thể tương đương với 2 trạng thái 1 hoặc 0 ứng với 2 mức logic cao hoặc thấp, hay có thể điều khiển start/stop bằng sườn lên xung lần 1 và sườn lên xung lần thứ 2.Last edited by hoanglonghv; 22-10-2010, 20:26.
Comment
-
Bạn thử nghĩ xem liệu có hợp lý không?đặc biệt là khi 2 trạng thái trong 3 trạng thái đó là stop và start.thường thì ko start thì stop và ko stop thì start. tuy nhiên ko phải ko có cách giải quyết.lập trình đầu vào sử dụng phím bấm (ấn thì mức logic cao tương đương là 1 và ko ấn thì là mức logic thấp tương đương 0).ấn lần nhất stop,ấn lần 2 start và giữ ấn thì reset về 0 (lập trình với thời gian ấn đủ lớn để ko nhầm với 2 trạng thái kia).tuy nhiên làm kiểu này ko ổn lắm vì độ trễ ấn là rất khó đoán biết được.trong VHDL có lệnh để kiểm tra sườn lên,sườn xuống và kiểm tra mức logic ('last value).Nếu chờ thời gian nữa mình sẽ gửi cho bạn code để giải quyết vấn đề trên nhưng dạo này mình bận quá nên chỉ nói ý tưởng cho bạn vậy.bạn đang học lớp nào bên MTA?Last edited by hoanglonghv; 22-10-2010, 20:46.
Comment
-
Hi hai_mta,
Đọc code của bạn có một số điểm cần lưu ý:
1) Reset
- Trước khi code VHDL/Verilog bạn nên học kĩ phần thiết kế số (digital design). Bạn nên vẽ được mạch trước khi viết code.
Trong VHDL, nếu muốn mô phỏng 1 flip-flop có chân reset là Asynchronous, bạn phải tuân theo code mẫu (template) như sau:
process(clk,rst)
begin
if(rst='1') then
Q <= '0';
elsif(rising_edge(clk)) then
Q <= D;
end if;
end process
if (start ='1') then
if (rst='1') then temp1 :=0;
temp2 :=0;
temp :=0;
ELSIF (clk'EVENT AND clk='1') THEN
signal Q: std_logic;
process(clk,rst)
begin
if(rst='1') then
Q <= '0';
elsif(rising_edge(clk)) then
if(start) then
Q <= D;
end if;
end if;
end process
Variable thường được sử dụng như 1 dây (wire). Trong code này bạn sử dụng các variable như các register.
Code của bạn có thể không sai nhưng "ngộ" hoặc "lạ"
Nếu bạn muốn tạo các thanh ghi, hay registers để đếm thì nên dùng signal.
VHDL/Verilog không phải là ngôn ngữ lập trình.
Bạn nên hình dung/vẽ ra sơ đồ mạch bạn đang thiết kế trước khi viết code.
Comment
-
Nếu làm từ đầu Jeff gợi ý làm như sau:
- Viết yêu cầu:
Các input: rst, clk, start, clr
Các output: Digit0, 1, ...
Rst: Asynchronous reset, khi rst = 1, trả các tín hiệu về 0
start: Chạy timer, start = 1 chay, start = 0 giữ nguyên
clear: trả các thanh ghi về giá trị 0. Khi clear = 1, không quan tâm giá trị của start, trả tất cả các biến về 0.
digit0, 1, ... sẽ được chuyển từ binary sang BCD. (BCD encoder)
Các tín hiệu nội bộ (internal)
thanh ghi: counter0, counter1, counter2 ...
thanh ghi counter0: trong điều kiện "chạy", counter0 sẽ đếm từ 0 tới 9, khi tới 9 thì quay lại 0
Sau đó sẽ code. Bạn chưa quen thì lấy giấy viết ra vẽ sơ đồ mạch.
signal counter0: std_logic_vector(3 downto 0);
process(clk,rst)
begin
if(rst='1') then counter0 <= 0;
elsif(rising_edge(clk)) then
if(clear='1') then --truong hop clear
counter0 <= 0;
else
if(start = '1') then --trường hợp chạy
if(counter0 = 9) then counter0 <= 0; else counter 0 <= counter 0+1; end if
end if;
end if;
....
end process
Comment
-
Nguyên văn bởi hoanglonghv Xem bài viếtBạn thử nghĩ xem liệu có hợp lý không?đặc biệt là khi 2 trạng thái trong 3 trạng thái đó là stop và start.thường thì ko start thì stop và ko stop thì start. tuy nhiên ko phải ko có cách giải quyết.lập trình đầu vào sử dụng phím bấm (ấn thì mức logic cao tương đương là 1 và ko ấn thì là mức logic thấp tương đương 0).ấn lần nhất stop,ấn lần 2 start và giữ ấn thì reset về 0 (lập trình với thời gian ấn đủ lớn để ko nhầm với 2 trạng thái kia).tuy nhiên làm kiểu này ko ổn lắm vì độ trễ ấn là rất khó đoán biết được.trong VHDL có lệnh để kiểm tra sườn lên,sườn xuống và kiểm tra mức logic ('last value).Nếu chờ thời gian nữa mình sẽ gửi cho bạn code để giải quyết vấn đề trên nhưng dạo này mình bận quá nên chỉ nói ý tưởng cho bạn vậy.bạn đang học lớp nào bên MTA?Last edited by hai_mta; 22-10-2010, 22:05.
Comment
-
Nguyên văn bởi hai_mta Xem bài viếtbạn ơi,nếu chỉ có 2 đầu vào một là clk,đầu vào còn lại là chung giữa start/stop/restet thì làm thế nào?
Comment
-
Nguyên văn bởi jefflieu Xem bài viếtHi hai_mta,
Đọc code của bạn có một số điểm cần lưu ý:
1) Reset
- Trước khi code VHDL/Verilog bạn nên học kĩ phần thiết kế số (digital design). Bạn nên vẽ được mạch trước khi viết code.
Trong VHDL, nếu muốn mô phỏng 1 flip-flop có chân reset là Asynchronous, bạn phải tuân theo code mẫu (template) như sau:
Code này của bạn không đúng (hoặc không được khuyến khích)
Nếu bạn muốn mạch của bạn chạy với 1 tín hiệu start, thì tín hiệu start chẳng qua là CLOCK_ENABLE của Flip-Flop (nếu bạn chưa biết Flip-flop thường có những chân gì thì bạn tra cứu lại trong sách hoặc google)
2) Sử dụng variable
Variable thường được sử dụng như 1 dây (wire). Trong code này bạn sử dụng các variable như các register.
Code của bạn có thể không sai nhưng "ngộ" hoặc "lạ"
Nếu bạn muốn tạo các thanh ghi, hay registers để đếm thì nên dùng signal.
VHDL/Verilog không phải là ngôn ngữ lập trình.
Bạn nên hình dung/vẽ ra sơ đồ mạch bạn đang thiết kế trước khi viết code.
Comment
-
Nguyên văn bởi hai_mta Xem bài viếtNhưng minh đọc sách có một bài tập như thế,mình đang học lớp ĐK6 (dân sự)
Comment
-
Nguyên văn bởi jefflieu Xem bài viếtMạch của bạn sẽ có dạng như sau:
[ATTACH=CONFIG]25426[/ATTACH]
F là hàm của (start/load và counter0)
Comment
-
Nguyên văn bởi jefflieu Xem bài viếtHằng ngày dùng chuột có 1 phím màh coi phim được tuốt: Pause/start, full-screen
Comment
-
Nguyên văn bởi hoanglonghv Xem bài viếtVà đúng là VHDL ko phải là ngôn ngữ lập trình mà là ngôn ngữ mô phỏng thôi tuy nhiên ko phải là với bất kỳ bài toán nào cũng hình dung cho được "vẽ ra sơ đồ mạch" trước khi viết code mà theo em nên hình dung được entity và những vấn đề giải quyết trong entity đó là gì.vì với những bài toán lớn thì ko thể làm như vậy được.
Comment
Bài viết mới nhất
Collapse
-
bởi xuanthiettivi em bị mất remote lỡ vào chế độ usb giờ không chọn lại source được. ai có file nạp cho em xin với ạ. Model 32HD957T2
-
Channel: Điện tử truyền hình
hôm nay, 10:53 -
-
Trả lời cho Giải thích nôm na từ "tụ bay"bởi chinhnguyen9Đa tạ lời cảm ơn của bạn. Mến!
-
Channel: Hướng dẫn sử dụng diễn đàn
hôm nay, 05:06 -
-
Trả lời cho Xin tư vấn về mạch cầu H cho inverter 1000wbởi thebinhzChắc là không được đâu bạn ơi
Quán ăn Vĩnh Yên-
Channel: Điện tử công suất
Hôm qua, 21:56 -
-
Trả lời cho Giải thích nôm na từ "tụ bay"bởi thebinhzCảm ơn bạn nhiều nha
Nhà hàng Vĩnh Yên-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 21:50 -
-
bởi chinhnguyen9Sản phẩm này ghi version 2.0 01-2024 MADE IN CHINA nhưng không thấy thương hiệu hình 1
Do 8 chân G của mosfet được đấu song song thành 2 nhóm nên có cùng biên độ xung kích. Nhưng Q1 và Q2 nằm cuối dãy B3;B4 ờ mức nguồn cao nhất do chân Q có điện áp...-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 08:29 -
-
bởi chinhnguyen9
Xem hình có phần thuyết minh bên trong tiện việc quan sát và đọc thuyết minh. Khi G1 high dòng điện chạy theo các đường màu đen khi G2 high dòng điện chạy theo các đường màu nâu đỏ.
Bổ sung một tính chất củng cố cho tên gọi tụ...-
Channel: Hướng dẫn sử dụng diễn đàn
24-04-2024, 01:15 -
-
Trả lời cho CODE/ROM-dvb-vcd-dvd-mindikaraoke- Máy nạp Rombởi ThaPhong20Mình cần giúp đõ đầu California MIDI-800K
Ngày trc có nghe tin đồn đầu này có thể chạy đĩa DH-3600 nên mua Vol 26 về chạy thử và nó báo góc trái dòng code rồi tự thay nền DH-3600S luôn. Sau khi tự thay nền thì nó tiếp tục báo dòng Code...-
Channel: Thiết bị thu phát MEDIA dân dụng
23-04-2024, 19:24 -
-
Trả lời cho Xin tư vấn về mạch cầu H cho inverter 1000wbởi N.T.HIRF460 có chịu được tải 1000W công suất thực không ạ....
-
Channel: Điện tử công suất
23-04-2024, 16:05 -
-
bởi chinhnguyen9Trước đây có thế hệ mạch cân bằng chủ động hoạt động theo nguyên lý so áp giữa 2 cell (hoặc 2 chuỗi) liền kề nếu điện áp này >100mV mach cận bằng sẽ được kích hoạt và sẽ dừng hoạt động cân bằng khi độ chênh điện áp giảm xuống còn 30 mV
Hiện nay có dòng sản phẩm mới gọi là...-
Channel: Hướng dẫn sử dụng diễn đàn
23-04-2024, 07:26 -
-
Trả lời cho Hỏi về mạch công suất bị dò DCbởi vandoanĐiện áp ở A và C được ghim bởi Transistor Q8. chuyện áp ra loa + hay - là do các trans khác bị chập chập bên nào thì thay bên đó.
-
Channel: Điện thanh
20-04-2024, 12:00 -
Comment