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
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi tuyennhanCách ly dây điện vào , bộ nguồn và đèn khỏi khung xe thì có rò thật cũng không lo bị giật .
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 08:56 -
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
-
bởi namlangnhoXin chào mọi người. E có sử dụng 1 cục nguồn tổ ong 12v-30A chạy đèn led xe trà sữa. Mà thợ thi công bị rò điện nên điện rò ra khung xe. E dùng đồng hồ đo điện ở khung xe và cả output thì thấy có dòng điện xoay chiều hơn 100v. Nên chạm...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 00:12 -
-
bởi Manh.n.trCác bác cho em hỏi cách điều chế xung răng cưa sang xung vuông với ạ. Em đang thấy khó ạ...
-
Channel: Kỹ thuật điện tử tương tự
13-12-2024, 20:46 -
Comment