根据某些读者的要求,我在此VHDL项目中为FIFO内存进行了VHDL代码(FIFO记忆的Verilog代码).
这 FIFO 有16个8位数据宽度阶段和五个状态信号,包括溢出,下溢,空,完整和阈值。通过在Xilinx ISIM上进行混合语言仿真,通过相同的Verilog测试台码验证FIFO存储器的VHDL代码。

FIFO的VHDL代码如下:
Library IEEE; USE IEEE.Std_logic_1164.all; -- FPGA projects using VHDL/ VHDL -- fpga4student.com -- FIFO内存的VHDL代码 entity fifo_mem is port( data_out : out std_logic_vector(7 downto 0); fifo_full, fifo_empty, fifo_threshold,
fifo_overflow, fifo_underflow: out std_logic; clk :in std_logic; rst_n: in std_logic; wr :in std_logic; rd: in std_logic; data_in: in std_logic_vector(7 downto 0) ); end fifo_mem; architecture Behavioral of fifo_mem is component write_pointer port( wptr : out std_logic_vector(4 downto 0); fifo_we: out std_logic; clk :in std_logic; rst_n: in std_logic; wr :in std_logic; fifo_full: in std_logic ); end component; component read_pointer port( rptr : out std_logic_vector(4 downto 0); fifo_rd: out std_logic; clk :in std_logic; rst_n: in std_logic; rd :in std_logic; fifo_empty: in std_logic ); end component; component memory_array port( data_out : out std_logic_vector(7 downto 0); rptr: in std_logic_vector(4 downto 0); clk :in std_logic; fifo_we: in std_logic; wptr :in std_logic_vector(4 downto 0); data_in: in std_logic_vector(7 downto 0) ); end component; component status_signal port( fifo_full, fifo_empty, fifo_threshold: out std_logic; fifo_overflow, fifo_underflow : out std_logic; wr, rd, fifo_we, fifo_rd,clk,rst_n :in std_logic; wptr, rptr: in std_logic_vector(4 downto 0) ); end component; signal empty, full: std_logic; signal wptr,rptr: std_logic_vector(4 downto 0); signal fifo_we,fifo_rd: std_logic; begin write_pointer_unit: write_pointer port map ( wptr => wptr, fifo_we=> fifo_we, wr=> wr, fifo_full => full, clk => clk, rst_n => rst_n ); read_pointer_unit: read_pointer port map ( rptr => rptr, fifo_rd => fifo_rd, rd => rd , fifo_empty => empty, clk => clk, rst_n => rst_n ); memory_array_unit: memory_array port map ( data_out => data_out, data_in => data_in, clk => clk, fifo_we => fifo_we, wptr => wptr, rptr => rptr ); status_signal_unit: status_signal port map ( fifo_full => full, fifo_empty => empty, fifo_threshold => fifo_threshold, fifo_overflow => fifo_overflow, fifo_underflow => fifo_underflow, wr => wr, rd => rd, fifo_we => fifo_we, fifo_rd => fifo_rd, wptr => wptr, rptr => rptr, clk => clk, rst_n => rst_n ); fifo_empty <= empty; fifo_full <= full; end Behavioral; Library IEEE; USE IEEE.Std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- FPGA projects using VHDL/ VHDL -- fpga4student.com -- FIFO内存的VHDL代码 -- status signals entity status_signal is port( fifo_full, fifo_empty, fifo_threshold: out std_logic; fifo_overflow, fifo_underflow : out std_logic; wr, rd, fifo_we, fifo_rd,clk,rst_n :in std_logic; wptr, rptr: in std_logic_vector(4 downto 0) ); end status_signal; architecture Behavioral of status_signal is signal fbit_comp, overflow_set, underflow_set: std_logic; signal pointer_equal: std_logic; signal pointer_result:std_logic_vector(4 downto 0); signal full, empty: std_logic; begin fbit_comp <= wptr(4) xor rptr(4); pointer_equal <= '1'
when (wptr(3 downto 0) = rptr(3 downto 0)) else '0'; pointer_result <= wptr - rptr; overflow_set <= full and wr; underflow_set <= empty and rd; full <= fbit_comp and pointer_equal; empty <= (not fbit_comp) and pointer_equal; fifo_threshold <= '1'
when (pointer_result(4) or pointer_result(3))='1' else '0'; fifo_full <= full; fifo_empty <= empty; process(clk,rst_n) begin if(rst_n='0') then fifo_overflow <= '0'; elsif(rising_edge(clk)) then if ((overflow_set='1')and (fifo_rd='0')) then fifo_overflow <='1'; elsif(fifo_rd='1') then fifo_overflow <= '0'; end if; end if; end process; process(clk,rst_n) begin if(rst_n='0') then fifo_underflow <='0'; elsif(rising_edge(clk)) then if((underflow_set='1')and(fifo_we='0')) then fifo_underflow <='1'; elsif(fifo_we='1') then fifo_underflow <='0'; end if; end if; end process; end Behavioral; Library IEEE; USE IEEE.Std_logic_1164.all; USE ieee.numeric_std.ALL; -- FPGA projects using VHDL/ VHDL -- fpga4student.com -- FIFO内存的VHDL代码 -- Memory array entity memory_array is port( data_out : out std_logic_vector(7 downto 0); rptr: in std_logic_vector(4 downto 0); clk :in std_logic; fifo_we: in std_logic; wptr :in std_logic_vector(4 downto 0); data_in: in std_logic_vector(7 downto 0) ); end memory_array; architecture Behavioral of memory_array is type mem_array is array (0 to 15) of std_logic_vector(7 downto 0); signal data_out2: mem_array; begin process(clk) begin if(rising_edge(clk)) then if(fifo_we='1') then data_out2(to_integer(unsigned(wptr(3 downto 0)))) <= data_in; end if; end if; end process; data_out <= data_out2(to_integer(unsigned(rptr(3 downto 0)))); end Behavioral; Library IEEE; USE IEEE.Std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- FPGA projects using VHDL/ VHDL -- fpga4student.com -- FIFO内存的VHDL代码 -- Read pointer entity read_pointer is port( rptr : out std_logic_vector(4 downto 0); fifo_rd: out std_logic; clk :in std_logic; rst_n: in std_logic; rd :in std_logic; fifo_empty: in std_logic ); end read_pointer; architecture Behavioral of read_pointer is signal re: std_logic; signal read_addr:std_logic_vector(4 downto 0); begin rptr <= read_addr; fifo_rd <= re ; re <= (not fifo_empty) and rd; process(clk,rst_n) begin if(rst_n='0') then read_addr <= (others => '0'); elsif(rising_edge(clk)) then if(re='1') then read_addr <= read_addr + "00001"; end if; end if; end process; end Behavioral; Library IEEE; USE IEEE.Std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- FPGA projects using VHDL/ VHDL -- fpga4student.com -- FIFO内存的VHDL代码 -- Write pointer entity write_pointer is port( wptr : out std_logic_vector(4 downto 0); fifo_we: out std_logic; clk :in std_logic; rst_n: in std_logic; wr :in std_logic; fifo_full: in std_logic ); end write_pointer; architecture Behavioral of write_pointer is signal we: std_logic; signal write_addr:std_logic_vector(4 downto 0); begin fifo_we <= we; we <= (not fifo_full) and wr; wptr <= write_addr; process(clk,rst_n) begin if(rst_n='0') then write_addr <= (others => '0'); elsif(rising_edge(clk)) then if(we='1') then write_addr <= write_addr + "00001"; end if; end if; end process; end Behavioral;
使用相同的测试台代码验证FIFO存储器的VHDL代码 前一篇文章。我使用Xilinx ISIM来运行混合语言仿真。 FIFO内存的VHDL代码的Verilog Testbench代码,您也可以下载 这里.
运行模拟后,正确的结果应如下所示:时间= 110, data_out = 1, mem = 1
时间= 120,WR = 1,RD = 0,data_in = 02
时间= 130, data_out = 1, mem = 1
时间= 140,WR = 0,RD = 0,data_in = 02
时间= 150, data_out = 1, mem = 1
时间= 170, data_out = 1, mem = 1
时间= 190, data_out = 1, mem = 1
时间= 190,WR = 1,RD = 0,data_in = 03
时间= 210, data_out = 1, mem = 1
时间= 210,WR = 0,RD = 0,data_in = 03
时间= 230, data_out = 1, mem = 1
时间= 250, data_out = 1, mem = 1
时间= 260,WR = 1,RD = 0,DATA_IN = 04
时间= 270, data_out = 1, mem = 1
时间= 280,WR = 0,RD = 0,data_in = 04
时间= 290, data_out = 1, mem = 1
时间= 310, data_out = 1, mem = 1
时间= 330, data_out = 1, mem = 1
时间= 330,WR = 1,RD = 0,data_in = 05
时间= 350, data_out = 1, mem = 1
时间= 350,WR = 0,RD = 0,data_in = 05
时间= 370, data_out = 1, mem = 1
时间= 390, data_out = 1, mem = 1
时间= 400,WR = 1,RD = 0,DATA_IN = 06
时间= 410, data_out = 1, mem = 1
时间= 420,WR = 0,RD = 0,data_in = 06
时间= 430, data_out = 1, mem = 1
时间= 450, data_out = 1, mem = 1
时间= 470, data_out = 1, mem = 1
时间= 470,WR = 1,RD = 0,DATA_IN = 07
时间= 490, data_out = 1, mem = 1
时间= 490,WR = 0,RD = 0,data_in = 07
时间= 510, data_out = 1, mem = 1
时间= 530, data_out = 1, mem = 1
时间= 540,WR = 1,RD = 0,DATA_IN = 08
时间= 550, data_out = 1, mem = 1
时间= 560,WR = 0,RD = 0,data_in = 08
时间= 570, data_out = 1, mem = 1
时间= 590, data_out = 1, mem = 1
时间= 610, data_out = 1, mem = 1
时间= 610,WR = 1,RD = 0,DATA_IN = 09
时间= 630, data_out = 1, mem = 1
时间= 630,WR = 0,RD = 0,data_in = 09
时间= 650, data_out = 1, mem = 1
时间= 670, data_out = 1, mem = 1
时间= 680,WR = 1,RD = 0,data_in = 0a
时间= 690, data_out = 1, mem = 1
时间= 700,WR = 0,RD = 0,data_in = 0a
时间= 710, data_out = 1, mem = 1
时间= 730, data_out = 1, mem = 1
时间= 750, data_out = 1, mem = 1
时间= 750,WR = 1,RD = 0,data_in = 0b
时间= 770, data_out = 1, mem = 1
时间= 770,WR = 0,RD = 0,data_in = 0b
时间= 790, data_out = 1, mem = 1
时间= 810, data_out = 1, mem = 1
时间= 820,WR = 1,RD = 0,DATA_IN = 0C
时间= 830, data_out = 1, mem = 1
时间= 840,WR = 0,RD = 0,DATA_IN = 0C
时间= 850, data_out = 1, mem = 1
时间= 870, data_out = 1, mem = 1
时间= 890, data_out = 1, mem = 1
时间= 890,WR = 1,RD = 0,data_in = 0d
时间= 910, data_out = 1, mem = 1
时间= 910,WR = 0,RD = 0,data_in = 0d
时间= 930, data_out = 1, mem = 1
时间= 950, data_out = 1, mem = 1
时间= 960,WR = 1,RD = 0,data_in = 0e
时间= 970, data_out = 1, mem = 1
时间= 980,WR = 0,RD = 0,data_in = 0e
时间= 990, data_out = 1, mem = 1
时间= 1010, data_out = 1, mem = 1
时间= 1030, data_out = 1, mem = 1
时间= 1030,WR = 1,RD = 0,data_in = 0f
时间= 1050, data_out = 1, mem = 1
时间= 1050,WR = 0,RD = 0,data_in = 0f
时间= 1070, data_out = 1, mem = 1
时间= 1090, data_out = 1, mem = 1
时间= 1100,WR = 1,RD = 0,data_in = 10
时间= 1110, data_out = 1, mem = 1
时间= 1120,WR = 0,RD = 0,data_in = 10
时间= 1130, data_out = 1, mem = 1
时间= 1150, data_out = 1, mem = 1
时间= 1170, data_out = 1, mem = 1
时间= 1170,WR = 1,RD = 0,DATA_IN = 11
时间= 1190, data_out = 1, mem = 1
时间= 1190,WR = 0,RD = 0,DATA_IN = 11
时间= 1210, data_out = 1, mem = 1
时间= 1220,WR = 0,RD = 1,data_in = 11
时间= 1230, data_out = 1, mem = 1
通过------通过----------通过-------------通过
时间= 1240,WR = 0,RD = 0,data_in = 11
时间= 1250, data_out = 2, mem = 2
时间= 1260,WR = 0,RD = 1,data_in = 11
时间= 1270, data_out = 2, mem = 2
通过------通过----------通过-------------通过
时间= 1280,WR = 0,RD = 0,data_in = 11
时间= 1290, data_out = 3, mem = 3
时间= 1300,WR = 0,RD = 1,DATA_IN = 11
时间= 1310, data_out = 3, mem = 3
通过------通过----------通过-------------通过
时间= 1320,WR = 0,RD = 0,data_in = 11
时间= 1330, data_out = 4, mem = 4
时间= 1340,WR = 0,RD = 1,DATA_IN = 11
时间= 1350, data_out = 4, mem = 4
通过------通过----------通过-------------通过
时间= 1360,WR = 0,RD = 0,DATA_IN = 11
时间= 1370, data_out = 5, mem = 5
时间= 1380,WR = 0,RD = 1,data_in = 11
时间= 1390, data_out = 5, mem = 5
通过------通过----------通过-------------通过
时间= 1400,WR = 0,RD = 0,data_in = 11
时间= 1410, data_out = 6, mem = 6
时间= 1420,WR = 0,RD = 1,DATA_IN = 11
时间= 1430, data_out = 6, mem = 6
通过------通过----------通过-------------通过
时间= 1440,WR = 0,RD = 0,data_in = 11
时间= 1450, data_out = 7, mem = 7
时间= 1460,WR = 0,RD = 1,data_in = 11
时间= 1470, data_out = 7, mem = 7
通过------通过----------通过-------------通过
时间= 1480,WR = 0,RD = 0,data_in = 11
时间= 1490, data_out = 8, mem = 8
时间= 1500,WR = 0,RD = 1,data_in = 11
时间= 1510, data_out = 8, mem = 8
通过------通过----------通过-------------通过
时间= 1520,WR = 0,RD = 0,data_in = 11
时间= 1530, data_out = 9, mem = 9
时间= 1540,WR = 0,RD = 1,data_in = 11
时间= 1550, data_out = 9, mem = 9
通过------通过----------通过-------------通过
时间= 1560,WR = 0,RD = 0,DATA_IN = 11
时间= 1570, data_out = 10, mem = 10
时间= 1580,WR = 0,RD = 1,data_in = 11
时间= 1590, data_out = 10, mem = 10
通过------通过----------通过-------------通过
时间= 1600,WR = 0,RD = 0,data_in = 11
时间= 1610, data_out = 11, mem = 11
时间= 1620,WR = 0,RD = 1,data_in = 11
时间= 1630, data_out = 11, mem = 11
通过------通过----------通过-------------通过
时间= 1640,WR = 0,RD = 0,data_in = 11
时间= 1650, data_out = 12, mem = 12
时间= 1660,WR = 0,RD = 1,data_in = 11
时间= 1670, data_out = 12, mem = 12
通过------通过----------通过-------------通过
时间= 1680,WR = 0,RD = 0,data_in = 11
时间= 1690, data_out = 13, mem = 13
时间= 1700,WR = 0,RD = 1,data_in = 11
时间= 1710, data_out = 13, mem = 13
通过------通过----------通过-------------通过
时间= 1720,WR = 0,RD = 0,data_in = 11
时间= 1730, data_out = 14, mem = 14
时间= 1740,WR = 0,RD = 1,data_in = 11
时间= 1750, data_out = 14, mem = 14
通过------通过----------通过-------------通过
时间= 1760,WR = 0,RD = 0,data_in = 11
时间= 1770, data_out = 15, mem = 15
时间= 1780,WR = 0,RD = 1,data_in = 11
时间= 1790, data_out = 15, mem = 15
通过------通过----------通过-------------通过
时间= 1800,WR = 0,RD = 0,data_in = 11
时间= 1810, data_out = 16, mem = 16
时间= 1820,WR = 0,RD = 1,data_in = 11
时间= 1830, data_out = 16, mem = 16
通过------通过----------通过-------------通过
FIFO内存的模拟波形:

通过观察模拟波形和内存,很容易看出数据如何写入FIFO以及如何从FIFO读出数据。有人注意到,溢出,下溢,空,完整的状态信号非常重要,可以确定FIFO的正确性。
推荐的 VHDL项目:
1. 什么是FPGA? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. FIR筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11. 完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计
19。 Verilog vs vhdl.:通过示例解释
20。 FPGA时钟分频器的VHDL代码
21。 如何生成时钟使能信号而不是创建另一个时钟域
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
1. 什么是FPGA? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. FIR筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11. 完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计
19。 Verilog vs vhdl.:通过示例解释
20。 FPGA时钟分频器的VHDL代码
21。 如何生成时钟使能信号而不是创建另一个时钟域
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
你可以帮助我,我想要FIFO 7 * 7和路由器7 * 7的代码
回复删除您能否为FIFO提供硬件设计,以便更好地了解内存和内存元素
回复删除