VHDL右移位寄存器问题
我是个新手,我正试图用VHDL实现除数元件的移位寄存器。移位寄存器必须接受15位输入,并在每个时钟周期将其向右移位,同时在最高有效位上链接“0”。 一、 我写了这段代码VHDL右移位寄存器问题,vhdl,shift,Vhdl,Shift,我是个新手,我正试图用VHDL实现除数元件的移位寄存器。移位寄存器必须接受15位输入,并在每个时钟周期将其向右移位,同时在最高有效位上链接“0”。 一、 我写了这段代码 -------右移---------------------------------- > library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; > > entity shift_right is port( in_s
-------右移----------------------------------
> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all;
>
> entity shift_right is port( in_shift_right: in std_logic_vector(14
> downto 0);
> clk_shift_right, rst_shift_right : in std_logic;
> out_shift_right : out std_logic_vector (14 downto 0) ); end shift_right;
>
> architecture behavioral of shift_right is begin
> process(clk_shift_right, rst_shift_right, in_shift_right ) variable
> tmp : std_logic_vector(14 downto 0); begin
> if rising_edge (clk_shift_right) then elsif rst_shift_right = '1' then
> tmp := (others => '0');
> elsif rising_edge(clk_shift_right) then
> tmp:='0'&in_shift_right(14 downto 1);
> end if;
> out_shift_right<=tmp; end process; end behavioral;
图书馆IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用ieee.numeric_std.all;
>
>实体shift\u right是端口(在shift\u right中:在std\u逻辑\u向量中(14
>降到0);
>时钟向右移位、rst向右移位:在标准逻辑中;
>out_shift_right:out标准逻辑向量(14向下到0);右移结束;
>
>右移开始了
>进程(clk\U shift\U right、rst\U shift\U right、in\U shift\U right)变量
>tmp:std_逻辑_向量(14到0);开始
>如果上升沿(clk\U shift\U right),则elsif rst\U shift\U right='1',则
>tmp:=(其他=>'0');
>elsif上升沿(时钟向右移动)然后
>tmp:='0'&向右移动(14向下移动到1);
>如果结束;
>向外移动,向右移动
>案例模式为
>--西索
>当“00”=>
>温度(6至0)温度(7)出口
>--国家知识产权局
>当“01”=>
>温度(6至0)温度(7)撅嘴
>--皮波
>当“10”=>
>临时撅嘴
>
>当其他人=>
>无效;
>
>终例;
>
>如果结束;
>
>结束过程;
>
>结束行为;
它实际上按照我的要求工作,但是,正如你从波形中看到的,它只在“case”上选择的模式为“01”时工作,但只有在“10”模式之后才工作。
我也不明白为什么它只能在时钟周期延迟后工作,我在图中突出显示了这一点:
非常感谢任何能帮助我的人如果你整理代码的缩进,我想你会立即发现一些问题。例如,考虑一下这段代码将做什么:
if rising_edge (clk_shift_right) then
elsif rst_shift_right = '1' then
tmp := (others => '0');
elsif rising_edge(clk_shift_right) then
...
最终的elsif
的内容永远无法访问
第二个注释是,您已将rst
和置于灵敏度列表中的\u shift\u right
。您想要同步重置还是异步重置?如果是同步的,则不需要在灵敏度列表中显示rst。无论哪种方式,我都不认为有任何理由将放在灵敏度列表中的\u shift\u right
第三点意见是,使用变量(tmp
)可能令人担忧。您的用法完全有效,语法正确,但在这种情况下似乎是一个非常奇怪的选择。如果这是一个深思熟虑的风格选择,那没关系。但是,如果您不理解信号
和变量
之间的区别,那么我建议您花一点时间。记住,这不是软件;您正在描述硬件
第四条评论是,你的作业tmp:='0'&向右移动(14向下移动到1)
始终在右移位中使用输入的上14位
。这显然不是你想做的(你想保持右移)。试着想想需要什么样的硬件来实现这一点
您已经包含了ieee.numeric\u std
库,因此实际上有一个可以直接使用的shift\u right
函数。您没有确切地描述希望块执行的操作,但我猜是这样的(假设异步重置):
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体右移位器为
一般的(
数据位:正:=15
);
港口(
clk:标准逻辑中;
rst:标准逻辑中;
--输入
in_valid:标准_逻辑中;
in_数据:in-std_逻辑_向量(数据_位-1向下至0);
--控制
shift_enable:在标准_逻辑中;
--输出
输出数据:输出标准逻辑向量(数据位-1到0)
);
右端移相器;
右移位器的结构rtl为
信号数据:无符号(数据位-1降到0);
开始
过程(时钟、rst)
开始
如果rst='1',则
--重置
数据“0”);
elsif上升沿(clk)则
如果in_valid='1',则
--加载新输入
数据你的代码非常混乱。我想如果你只是整理一下凹痕,你会立即发现一些问题。
if rising_edge (clk_shift_right) then
elsif rst_shift_right = '1' then
tmp := (others => '0');
elsif rising_edge(clk_shift_right) then
...
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity right_shifter is
generic (
DATA_BITS : positive := 15
);
port (
clk : in std_logic;
rst : in std_logic;
-- Input
in_valid : in std_logic;
in_data : in std_logic_vector(DATA_BITS-1 downto 0);
-- Control
shift_enable : in std_logic;
-- Output
out_data : out std_logic_vector(DATA_BITS-1 downto 0)
);
end right_shifter;
architecture rtl of right_shifter is
signal data : unsigned(DATA_BITS-1 downto 0);
begin
process(clk, rst)
begin
if rst = '1' then
-- Reset
data <= (others => '0');
elsif rising_edge(clk) then
if in_valid = '1' then
-- Load new input
data <= unsigned(in_data);
elsif shift_enable = '1' then
-- Shift right
data <= shift_right(data, 1);
end if;
end if;
end process;
out_data <= std_logic_vector(data);
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity right_shifter is
generic (
DATA_BITS : positive := 15
);
port (
clk : in std_logic;
rst : in std_logic;
-- Input
in_valid : in std_logic;
in_data : in std_logic_vector(DATA_BITS-1 downto 0);
-- Control
shift_enable : in std_logic;
-- Output
out_data : out std_logic_vector(DATA_BITS-1 downto 0)
);
end right_shifter;
architecture rtl of right_shifter is
signal data : unsigned(DATA_BITS-1 downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
-- Reset
data <= (others => '0');
elsif in_valid = '1' then
-- Load new input
data <= unsigned(in_data);
elsif shift_enable = '1' then
-- Shift right
data <= shift_right(data, 1);
end if;
end if;
end process;
out_data <= std_logic_vector(data);
end rtl;