亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

掌握VHDL有符号与无符号类型:实战洞察

数字设计师依赖FPGA/ASIC内精确算术。核心概念是VHDL中有符号与无符号数据类型区别。

两类型均定义于IEEE库numeric_std包。虽许多设计师仍用std_logic_arith,但该包非IEEE标准,不推荐生产设计使用。

VHDL中,有符号信号按二补数解释,允许正负值。无符号信号仅表示非负值。内部FPGA对所有位向量始终用二补数,无论声明类型。

位无符号值有符号值
01133
01022
00111
00000
1117-1
1106-2
1015-3
1004-4

乍看映射似反直觉,但理解二补数后行为可预测。

关键点:算术运算二进制结果相同,无论操作数声明有符号或无符号。变化的是结果解释。

例:加两5位向量:

 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end signed_unsigned; architecture behave of signed_unsigned is signal rs_SUM_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUM_RESULT : unsigned(4 downto 0) := (others => '0'); signal rs_SUB_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUB_RESULT : unsigned(4 downto 0) := (others => '0'); begin p_SUM : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUM_RESULT <= (others => '0'); ru_SUM_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUM_RESULT <= unsigned(i_a) + unsigned(i_b); rs_SUM_RESULT <= signed(i_a) + signed(i_b); end if; end process p_SUM; p_SUB : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUB_RESULT <= (others => '0'); ru_SUB_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUB_RESULT <= unsigned(i_a) - unsigned(i_b); rs_SUB_RESULT <= signed(i_a) - signed(i_b); end if; end process p_SUB; end behave; 

测试平台

 library ieee; use ieee.std_logic_1164.all; entity example_signed_unsigned_tb is end example_signed_unsigned_tb; architecture behave of example_signed_unsigned_tb is signal r_CLK : std_logic := '0'; signal r_RST_L : std_logic := '0'; signal r_A : natural := 0; signal r_B : natural := 0; signal r_A_SLV : std_logic_vector(4 downto 0) := (others => '0'); signal r_B_SLV : std_logic_vector(4 downto 0) := (others => '0'); constant c_CLK_PERIOD : time := 10 ns; component example_signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end component example_signed_unsigned; begin i_DUT: example_signed_unsigned port map ( i_rst_l => r_RST_L, i_clk => r_CLK, i_a => r_A_SLV, i_b => r_B_SLV ); clk_gen : process is begin r_CLK <= '0' after c_CLK_PERIOD/2, '1' after c_CLK_PERIOD; wait for c_CLK_PERIOD; end process clk_gen; process begin r_RST_L <= '0'; wait for 20 ns; r_RST_L <= '1'; wait for 20 ns; r_A_SLV <= "01001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00010"; wait for 20 ns; r_A_SLV <= "11111"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "00000"; r_B_SLV <= "00001"; wait for 20 ns; wait; end process; end behave; 
掌握VHDL有符号与无符号类型:实战洞察

Modelsim仿真波形——十六进制值

掌握VHDL有符号与无符号类型:实战洞察

Modelsim仿真波形——十进制值

两截图证实底层二进制结果无论类型相同。差异仅在仿真器显示:十六进制显示相同位模式,十进制有符号结果可能显负。FPGA逻辑设计中谨慎处理类型至关重要。

若任何部分仍不明,请通过侧边栏联系链接 邮件我们。乐意助您掌握有符号无符号算术。

Nandland热门页面

VHDL

  1. 交通信号灯:工程原理、历史沿革与未来创新
  2. 电流信号系统:4–20 mA 环路详解
  3. 高速 PCB 设计中信号完整性保障策略
  4. LoRa原生定位:为何比想象中更复杂
  5. VHDL入门:构建你的第一个与门
  6. VHDL类型转换全攻略:Numeric_Std与Std_Logic_Arith包详解
  7. VHDL过程示例:标准逻辑向量自增
  8. 善用VHDL记录类型构建整洁可复用FIFO接口
  9. VHDL变量详解:实用示例与可靠设计规则
  10. 精通PSL形式化验证VHDL模块:从理论到实战
  11. VHDL 字符串列表创建:最佳实践与示例
  12. 优雅结束 VHDL 测试平台仿真