FPGA|CPLD|ASIC论坛
直播中

jf_94280101

1年用户 3经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

求助: VHDL编程,简单计数器modelsim

VHDL入门小白,在大学实验室做研究型实习。大项目是设计一个RISC-V架构的处理器。但是现在卡在老师布置的一个作业上。
image.png

老师推荐的设计框架是这样的。我一开始没看明白就直接创建一个实体,定义接口,然后在process里把计数器全部写完了。

-- Simple counter
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.numeric_std.ALL;
ENTITY simple_counter IS
	GENERIC(
		MAX_COUNT : integer :=5
);
	PORT(
		rst: IN std_logic := '1';
		clk: IN std_logic;
		mcount: OUT std_logic :='0';
		count: OUT integer range 0 to MAX_COUNT
);
END ENTITY simple_counter;

ARCHITECTURE Behavioral OF simple_counter IS
	SIGNAL count_up : std_logic_vector(3 downto 0);
BEGIN

PROCESS(clk)
VARIABLE tmp : integer;
BEGIN
	
	IF(rising_edge(clk)) THEN
		IF(rst='0') THEN
			count_up <=x"0";
--			mcount <= '0';
--		ELSIF(tmp > MAX_COUNT) THEN
--			count_up <= std_logic_vector(unsigned(MAX_COUNT));
--			mcount <= '1';
		ELSE 
			count_up <= count_up + x"1";
--			mcount <= '0';
		END IF;
	
	tmp := to_integer(unsigned(count_up));
	IF (tmp > MAX_COUNT) THEN
		count <= MAX_COUNT;
		mcount <= '1';
	ELSE 
		count <= tmp;
		mcount <='0';
	END IF;
	END IF;
END PROCESS;

END ARCHITECTURE;

但是在进行模拟的时候发现,无法完成老师的这一项模拟:

Test 4 Map therstport of the counter with theopenkeyword, and set theTB_MAX_COUNT constant of the testbench to the value 10. In this test the counter must be counting at all rising edges ofclk, irrespective of therstvalue.

我感觉testbench是没有问题的,问题应该还是在源代码上。思路我大概知道,创建3个component,定义内部接口的属性和信号,作3个port map。但是到了process这一步我又不明白了:是需要分别给3个component写各自的process吗?我在网上找到不少计数器的示例,但是没有找到分成3个block的计数器。

在此谢过各位。

-- Simple counter test bench
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY simple_counter_tb IS
END ENTITY simple_counter_tb;

ARCHITECTURE behavior OF simple_counter_tb IS 

CONSTANT TB_MAX_COUNT : integer := 10;
COMPONENT simple_counter
	GENERIC(
		MAX_COUNT : integer :=TB_MAX_COUNT
);
	PORT(
		rst: IN std_logic := '1';
		clk: IN std_logic;
		mcount: OUT std_logic;
		count: OUT integer range 0 to TB_MAX_COUNT
);

END COMPONENT simple_counter;
	--INPUTS
	signal rst : std_logic := '1';
	signal clk : std_logic;
	--OUTPUTS
	signal mcount: std_logic;
	signal count: integer range 0 to TB_MAX_COUNT;

BEGIN
	-- Instantiate the Design Under Test (DUT) and map its ports
	dut: simple_counter
	PORT MAP (
		-- Mapping: component port (left) => this arch signal/port (right)
		rst  => open,
		clk => clk,
		mcount => mcount,
		count => count 
	);
clock_proc:PROCESS
BEGIN
	clk <= '0';
	WAIT FOR 10 ns;
 	clk <= '1';
	WAIT FOR 10 ns;
END PROCESS;

stimuli:PROCESS
BEGIN
	rst <= '0';
	for i in 1 to 3 loop
		wait until rising_edge(clk);
	end loop;
	WAIT FOR 2 ns;
	
	rst <= '1';
	for i in 1 to TB_MAX_COUNT+1 loop
		wait until rising_edge(clk);
	end loop;
	WAIT FOR 2 ns;

	rst <= '0';
	for i in 1 to 3 loop
		wait until rising_edge(clk);
	end loop;
	WAIT FOR 2 ns;

	rst <= '1';
	for i in 1 to 3 loop
		wait until rising_edge(clk);
	end loop;
	WAIT FOR 2 ns;

	ASSERT false
	  REPORT "Simulation ended ( not a failure actually ) "
	  SEVERITY failure ;
	WAIT FOR 10ns;
END PROCESS;





END ARCHITECTURE;

*附件:lab-assign-s6-simple_counter.pdf

回帖(1)

jf_28341673

2023-3-11 01:32:41
VHDL语言参考:
http://valhalla.altium.com/Learn ... age%20Reference.pdf

你得好好理解作业要求。老师要求硬件描述分block。
关于block的描述在上面这份资料的"Partitioning Features"这一章。你得用block把process包装起来。

老师要求分两个block,第一个包含计数功能,必须用时序逻辑。第二个要求用组合逻辑描述,用when保留字做判断。
像这样:
architecture compare1 of compare is
begin
EQ <= '1' when (A = B) else '0';
end compare1;

你的文件中既没有分block也没有用到when保留字,老师恐怕不会满意。

你不要把VHDL理解成一个程序,要把它理解成一系列逻辑电路,和逻辑电路的连接关系。
定义完逻辑电路和连接关系之后,逻辑电路是每时每刻都在工作的,没有程序执行到了哪里的概念。当然testbench是另一回事。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分