這兩個VHDL的問題終於解決了!

2022-01-29 03:54:11 字數 3096 閱讀 3531

這個星期做eda的課程設計,終於得用vhdl寫一些東西了,而不僅僅是實驗課的時候那樣十幾行就能解決了。

寫長一點的時候,發現兩個相當棘手的禁令啊:

1、乙個程序內不能進行兩次邊沿檢測。

2、不同程序不能對同一訊號進行賦值。

正因為這兩條「禁令」,讓本來看上去很簡單的東西搞得我焦頭爛額了。

於是,我打算把事情簡單化,做了兩個這樣的練習:

1、兩個按鍵,分別控制乙個值的加和減。(這個主要是為了解決「禁令1」)

2、乙個按鍵,按下按鍵輸出乙個固定時間脈衝。(解決「禁令2」)

我先做的是第二個練習。如果沒有禁令,我的想法是,乙個程序內檢測到按鍵訊號上公升沿的時候對訊號a寫『1』,然後另外乙個程序檢測到訊號a為『1』時開始用時鐘訊號計時並輸出,到時間後對這個訊號a寫『0』。看上去十分簡單,天衣無縫,但是因為「禁令2」,這個簡單的方法不能實現。

我的解決方法是用了兩個訊號,並且還有優先順序的區別:

1

library ieee;

2 use ieee.std_logic_1164.all;3

4entity keyclk is

5port(

6 clk:in

std_logic

;7 c_in:in

std_logic

;8 c_out:out

std_logic9);

10end;

1112 architecture one of keyclk is

13signal out_flag,stop_flag:std_logic;14

begin

1516

17process

(c_in,out_flag)

18begin

19if c_in='1'

then

20 out_flag<='1'

;

21 elsif stop_flag='1'

then

22 out_flag<='0'

;23endif;24

endprocess;25

26 c_out<=in_flag;

2728

process

(clk,in_flag)

29variable cnt:integer

range0to

100;

30begin

31if

rising_edge(clk) then

32if out_flag='1'

then

33 stop_flag<='0'

;34if cnt<5

then

35 cnt := cnt+1;36

37else

38 cnt := 0

;39 stop_flag<='1'

;40endif;41

endif;42

endif;43

endprocess;44

end;

第二個練習是這樣的,貌似有點糾結:

1

library

ieee;

2use ieee.std_logic_1164.all;3

use ieee.std_logic_unsigned.all;4

5entity twokey is

6port

(7 clk:in

std_logic

;8 key1,key2:in

std_logic

;9 key_rst:in

std_logic

;10 qout:out

std_logic_vector(7

downto0)

11);

12end

entity;13

14architecture one of twokey is

15signal key1_down,key2_down:std_logic;16

signal qout2:std_logic_vector(7

downto0);

17begin

18process

(key1,key2,key_rst,clk)

19begin

20if

rising_edge(clk) then

21if key_rst='1'

then

22 qout2<=(others=>'0'

);23

else

24if key1='1'

and key1_down='0'

then

25 key1_down<='1'

;26 qout2<=qout2+'1'

;27 elsif key1='0'

then

28 key1_down<='0'

;29endif;30

if key2='1'

and key2_down='0'

then

31 key2_down<='1'

;32 qout2<=qout2-'1'

;33 elsif key2='0'

then

34 key2_down<='0'

;35endif;36

endif;37

endif;38

endprocess

;39 qout<=qout2;

40end;

解決了兩個sql問題

friday february 17,2006 05 24pm cst 1。decode 不僅僅針對固定值 case when b.aggregateno is null or b.aggregateno then customerid else b.aggregateno end 也可以寫成 de...

今天通過GG解決了兩個問題

1.svn的show log功能發生錯誤。svn 遇到不可讀的路徑 解決辦法 在conf serve.conf中,設定 anon access none 2.專案檔案 已被重新命名或已不在解決方案中 遇到問題的解決方案是乙個web解決方案,按照網上說的新增引用後,問題依舊。聯絡到我以前建過乙個sil...

解決兩個問題

早上一開啟虛擬機器登入ubuntu,就遇到兩個問題,2 登入進去後,ubuntu的工作列不見了。解決方案 1 對於第乙個問題,使用如下命令 sudo chmod 755 r home 使用者名稱 chmod 644 home 使用者名稱 dmrc 2 對於第二個問題,1,安裝gnome panel ...