VHDL数据取反操作
对于数据取反,通常需要加入use ieee.std_logic_signed.all程序包。这里举例,对8位宽的数据进行取反操作。library IEEE;use IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_arith.all;use ieee.std_logic_signed.all;entity top isport(clk...
·
对于数据取反,通常需要加入use ieee.std_logic_signed.all程序包。这里举例,对8位宽的数据进行取反操作。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity top is
port(
clk : in std_logic;
rst : in std_logic;
din : in std_logic_vector(7 downto 0);
dout : out std_logic_vector(7 downto 0)
);
end top;
architecture Behavioral of top is
begin
process(clk,rst)
begin
if rst = '1' then
dout <= (others => '0');
elsif rising_edge(clk) then
dout <= -din;
end if;
end process;
end Behavioral;
添加testbench,对代码仿真。
module tst_top;
// Inputs
reg clk;
reg rst;
reg [7:0] din;
// Outputs
wire [7:0] dout;
// Instantiate the Unit Under Test (UUT)
top uut (
.clk(clk),
.rst(rst),
.din(din),
.dout(dout)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 1;
din = 8'd0;
// Wait 100 ns for global reset to finish
#100;
rst = 0;
end
always @(posedge clk)
begin
din <= din + 1;
end
always #5 clk =~clk;
endmodule
设计对渐加数取反,在Modelsim上观察仿真结果
现象:根据仿真结果看,在输入10000000(-128)时,输出为10000000(-128),结果出错。
分析出错原因:8位有符号数的表示范围为-128~127,无法表示128,所以溢出导致出错。
解决方法:判断输入数据是否为10000000。是,输出127;否,直接取反。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)