实验一 序列检测器
- 实验内容
设计一个序列检测器检测序列1110010。
- 设计思路
每输入一个序列1110010则会在输出端输出一个1,其余时间为0。
首先写出状态转移图,再利用case语句,根据状态转移图写出状态的转移及输出。
检测序列为七位,所以可以设状态机状态数为8个;
输出信号由当前状态和输入条件决定,设计为mealy型状态机(moore型同样可实现);
采用异步复位。
library ieee;
use ieee.std_logic_1164.all;
entity LineCheck IS
port(clk,cin,rst:in std_logic;
result:out std_logic);
end LineCheck;
ARCHITECTURE pr of LineCheck IS
type state is (s0,s1,s2,s3,s4,s5,s6,s7);
signal n_state,c_state:state;
begin
process(clk,rst)
begin
if(rst='1') then n_state<=s0;
elsif(clk'event and clk='1')
then n_state<=c_state;
end if;
end process;
process(n_state,cin)
begin
case n_state is
when s0=> result<='0';
if(cin='1')
then c_state<=s1;
else
c_state<=s0;
end if;
when s1=> result<='0';
if(cin='1')
then c_state<=s2;
else
c_state<=s0;
end if;
when s2=> result<='0';
if(cin='1')
then c_state<=s3;
else
c_state<=s0;
end if;
when s3=> result<='0';
if(cin='1')
then c_state<=s3;
else
c_state<=s4;
end if;
when s4=> result<='0';
if(cin='1')
then c_state<=s1;
else
c_state<=s5;
end if;
when s5=> result<='0';
if(cin='1')
then c_state<=s6;
else
c_state<=s0;
end if;
when s6=> result<='0';
if(cin='1')
then c_state<=s2;
else
c_state<=s7;
end if;
when s7=> result<='1';
if(cin='1')
then c_state<=s1;
else
c_state<=s0;
end if;
end case;
end process;
end pr;
波形图:
实验二 计数器
- 实验介绍
计数器是通过电路的状态反映驶入脉冲数目的电路。计数器是应用非常广泛的时序电路,按照技术的特点分为二进制计数器、十进制计数器、环形计数器、扭环形计数器等。二进制计数器又分为加计数器、减计数器等。
- 实验内容
用VHDL语言实现计数状态连续的模值为2N的计数器。这是一个同步清零的4位二进制加计数器,其计数的状态是从“0000~1111”进行变化。整个的计数周期是16个时钟周期,即24个时钟周期。凡是这种技术周期为2N且对计数状态无特殊要求的计数器,可以通过直接定义N位的计数信号和端口,对信号进行加或减操作,而不必进行计数状态的判断和控制。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity CountNum IS
port(clk,clr:in std_logic;
tmp:buffer bit_vector(3 downto 0));
end CountNum;
architecture CountProcess of CountNum is
begin
process(clk,clr)
begin
if(clr='1')
then tmp<=(others=>'0');
elsif(clk='1' and clk'event)
then
case tmp is
when "0000"=>tmp<="0001";
when "0001"=>tmp<="0010";
when "0010"=>tmp<="0011";
when "0011"=>tmp<="0100";
when "0100"=>tmp<="0101";
when "0101"=>tmp<="0110";
when "0110"=>tmp<="0111";
when "0111"=>tmp<="1000";
when "1000"=>tmp<="1001";
when "1001"=>tmp<="1010";
when "1010"=>tmp<="1011";
when "1011"=>tmp<="1100";
when "1100"=>tmp<="1101";
when "1101"=>tmp<="1110";
when "1110"=>tmp<="1111";
when "1111"=>tmp<="0000";
end case;
end if;
end process;
end CountProcess;
枚举法的波形就不打啦~
实验三 8位寄存器74374
- 实验介绍
在数字系统中,寄存器可用来存储一组二进制代码,而触发器具有记忆功能,所以可以用触发器构成寄存器。本实验要求同学们完成8位寄存器74374的VHDL描述。74374的逻辑框图如下图所示,功能表如下表所示。逻辑框图中D为寄存器的8位数据输入,Q位寄存器的8位数据输出端,CLK为时钟信号,OE为控制信号。从功能表可以看出OE为低电平时,在时钟上升沿输入端信号从输出端输出,其他时刻输出保持;而OE为高电平时,输出一直保持为高阻。
表4-1 74374的功能表
OE |
CLK |
D |
Q |
0 |
↑ |
1 |
1 |
0 |
↑ |
0 |
0 |
0 |
0 |
X |
保持 |
1 |
X |
X |
高阻 |
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SaveNum IS
port(d:in std_logic_vector(7 downto 0 );
OE,CLK:in std_logic;
q:buffer std_logic_vector(7 downto 0 ) );
end SaveNum;
architecture Spro of SaveNum is
begin
process(CLK,OE)
begin
if(OE='0')
then if(rising_edge(CLK))
then q<=d;
else
q<=q;
end if;
else
q<="11111111";
end if;
end process;
process(d)
begin
end process;
end Spro;文章来源:https://www.toymoban.com/news/detail-490232.html
波形图,输入的周期得调的大一点文章来源地址https://www.toymoban.com/news/detail-490232.html
到了这里,关于bupt数字逻辑时序逻辑实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!