- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本质上,我的问题是:“这不能更容易吗?”;什么是'this',如下(代码也是):
我想有一种“补码”计数器功能,用 VHDL 实现,它基本上会在每一步中反转/补码/不是计数器值,为测试提供稍微丰富的位模式。当然,我希望它是可综合的(因此计数器值可以分配给引脚)和可移植代码(即仅实现 IEEE 库,没有 STD_LOGIC_ARITH
)。我也不想默认将所有都视为无符号(所以我想避免 STD_LOGIC_UNSIGNED
)。
简而言之,这个计数器可以描述为:给定初始值 C[0],那么每个时钟滴答的值将是:
C[i+1] = not(C[i]) + ( ( C[i]<(Cmax/2) ) ? 0 : 1 )
C[i+1] = 65535 - C[i] + ( ( C[i]<32768 ) ? 0 : 1 )
Y <= not(Y) + Y(15);
std_logic_vector
有补码 not()
定义;但它没有 +
(附加)定义natural
/integer
可能在内部占用 32 位,因此不必指定它们的位宽;他们支持算术+
, 但没有补充 not()
unsigned
也有一些问题(不记得)std_logic_vector
时才能提取第 15 位 (MSB) ,在这种情况下,Y(15) 是单个
std_logic
- 但是,它需要转换为
integer
类型,否则添加
+
未定义:|
SIGNAL wCntReg : STD_LOGIC_VECTOR(15 DOWNTO 0)
;另一个是
SIGNAL tmp_na : natural
.然后:
natural
执行计算变量(从 STD_LOGIC_VECTOR
复制)std_logic
只能转换为 integer
如果它转换为 std_logic_vector
首先(我很幸运在网上找到了vectorize
函数)。 natural
变量值,返回
STD_LOGIC_VECTOR
一;我可以构建的唯一有效命令是:
wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_na), wCntReg'length));
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- use IEEE.STD_LOGIC_ARITH.ALL;
-- use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
ENTITY complement_count_test_tbw IS
END complement_count_test_tbw;
ARCHITECTURE testbench_arch OF complement_count_test_tbw IS
-- http://www.ingenieurbuero-eschemann.de/downloads/ipicregs/example/vhdl/test/timer_regs_tb.vhd
-- convert std_logic to std_logic_vector(0 downto 0)
function vectorize(s: std_logic) return std_logic_vector is
variable v: std_logic_vector(0 downto 0);
begin
v(0) := s;
return v;
end;
-- DECLARE REGISTERS ==========================
-- 'wires'
SIGNAL wtCLK : std_logic := '0';
-- counter register: 16 bit
SIGNAL wCntReg : STD_LOGIC_VECTOR(15 DOWNTO 0) := (others => 'Z');
-- temporary 'natural' copy of counter register
-- http://www.velocityreviews.com/forums/t21700-std_logic_vector-to-unsigned-type-casting.html
SIGNAL tmp_na : natural;
-- clock parameters
constant PERIODN : natural := 20; -- can be real := 20.0;
constant PERIOD : time := PERIODN * 1 ns;
constant DUTY_CYCLE : real := 0.5;
constant OFFSET : time := 100 ns;
-- freq divisor; with initial values
constant fdiv : natural := 16;
SIGNAL fdiv_cnt : natural := 1;
SIGNAL wfdiv_CLK : std_logic := '0';
BEGIN
-- initializations of connections:
-- instances of components, and their wiring (port maps)...
-- END instances of components, and their wiring (port maps)...
-- PROCESSES (STATE MACHINES) CODE =========
-- clock process for generating CLK
PROCESS
BEGIN
WAIT for OFFSET;
CLOCK_LOOP : LOOP
wtCLK <= '0';
-- MUST refresh counter reg here with value of tmp_na
wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_na), wCntReg'length));
WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
wtCLK <= '1';
WAIT FOR (PERIOD * DUTY_CYCLE);
END LOOP CLOCK_LOOP;
END PROCESS;
-- freq divided clock
freq_divisor: PROCESS(wtCLK)
BEGIN
IF rising_edge(wtCLK) THEN -- posedge
IF fdiv_cnt = fdiv THEN
-- reset
fdiv_cnt <= 1 ;
wfdiv_CLK <= not(wfdiv_CLK);
ELSE
fdiv_cnt <= fdiv_cnt + 1;
END IF;
END IF;
END PROCESS freq_divisor;
-- sim: count
PROCESS
BEGIN
WAIT for 10 ns;
tmp_na <= 125;
WAIT for 10 ns;
TESTCOUNT_LOOP: LOOP
-- change counter on negedge of freq. divided clock
WAIT until falling_edge(wfdiv_CLK);
tmp_na <= to_integer(unsigned(not(wCntReg))) + to_integer(unsigned(vectorize(wCntReg(15))));
WAIT for 10 ns;
END LOOP TESTCOUNT_LOOP;
END PROCESS;
-- END PROCESSES (STATE MACHINES) CODE =====
-- END IMPLEMENT ENGINE of 'CORE' ===============
END testbench_arch;
-- END ARCHITECTURE -----------------------------
最佳答案
首先,avoiding not use std_logic_arith 满分!
如果您将向量定义为 unsigned
那么(在流程之外)所需要的就是:
cn_plus_1 <= not cn when cn < halfc else (not cn) + 1;
cn_plus_1
到
std_logic_vector
因此:
wCntReg <= std_logic_vector(cn_plus_1);
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity funny_counter1 is
port (
cn: IN unsigned(15 downto 0);
cn_plus_1 : out unsigned(15 downto 0));
end entity funny_counter1;
architecture a1 of funny_counter1 is
constant halfc : unsigned(cn'range) := (cn'high => '1', others => '0');
begin -- architecture a1
cn_plus_1 <= not cn when cn < halfc else (not cn) + 1;
end architecture a1;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity funny_counter is
port (
clk : in std_logic;
reset : in std_logic;
cout : out unsigned(15 downto 0));
end entity funny_counter;
architecture a1 of funny_counter is
constant halfc : unsigned(cout'range) := (cout'high => '1', others => '0');
begin
process (clk) is
variable c : unsigned(15 downto 0);
variable add : integer range 0 to 1;
begin -- process
if rising_edge(clk) then -- rising clock edge
if reset = '1' then
c := (others => '0');
else
add := 0;
if c < halfc then
add := 1;
end if;
c := (not c) + add;
end if;
cout <= c;
end if;
end process;
end architecture a1;
std_logic_vector
之间进行了很多转换时s 和
integer
s(或类似的),您通常使用实际数字。使用
unsigned
/
signed
向量或整数。如果您需要一个向量,请在最后将其一劳永逸地转换。看着不一定是令人愉快的。但首先要询问您发送值的对象是否应该在其接口(interface)上使用某种数字类型。只有当它真的是一个“比特袋”时,它才是
std_logic_vector
最好的类型。姓名
wCntReg
对我来说听起来像是一个计数值,所以我认为它应该有一个数字类型。
wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_na), wCntReg'length));
wCntReg <= std_logic_vector(to_unsigned(tmp_na, wCntReg'length));
tempna
是一个变量,你可以在之后立即进行 wCntReg 赋值。
wait for 0 ns;
信号分配后。从更新的角度来看,这会导致一些时间过去,因此所有其他增量周期将在当前时间执行(包括您想要传播的信号分配)时间将继续(0ns!)并且新的增量周期可以开始。
关于integer - VHDL 补码计数器问题 : converting std_logic to integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701075/
在取反数字符号的两个补码中,您通常只需取反每一位并加 1。 例如: 011 (3) 100 + 1 = 101 (-3) 在 VHDL 中是: a <= std_logic_vector(unsign
我有这个代码: package com.company; import java.net.InetAddress; import java.net.UnknownHostException; publ
这个问题在这里已经有了答案: How do I perform a bitwise NOT in SSE/AVX? (4 个答案) 关闭 5 年前。 在 AVX2 中似乎没有按位非/补的内在函数。我
我是初学者。我正在尝试获取存储在字符串中的二进制数的 2 的补码sou2_reg='000000000000000000000000000000011'。如果我执行 sou2_reg[32],它会给我
我决定这样做 翻转数字 0=1, 1=0 LSB加1 如果进位,循环直到array[i]==0 但我坚持最后一点;我怎么能在条件循环中这样说呢? 最佳答案 你在谈论扩展算术。大多数处理器都有来自每个加
前言 补码是给机器看的,原码是给人看的,反码是二者的桥梁,原码反码补码虽然是简单问题,但确实很多人很长时间没有搞明白和深入思考,这篇把自己学习和理解过程记录下来,刚好一个学妹问
我运行一个内部应用程序,使用 visual studio 2008 编程,使用 SQL Server 2008 作为后端。除了服务器之外,我的用户还要求能够将数据存储在独立的文件中。列举的原因包括:
UInt16 Checksum16Calculate(CHECKSUM_16_TYPE* pChecksum) { //calculate twos compliment of checksum pC
这是我目前正在做的家庭作业。我们要做的就是查看传递的 32 位 int x 并返回以 2 补码形式存储该值所需的最少位。 例如: howManyBits(0) = 1; howManyBits(-1)
我想对 sum+ 中的任何位进行 1s 补码,并将补码的位保存在 finalsum 中。怎么做。我对使用 bitvec 和 uint32_t 类型的东西有点虚弱。所以我在这里很困惑。请帮忙。 #inc
我找到的所有关于如何找到 1(翻转正二进制位)和 2(翻转正二进制位并加 1)补码的答案似乎都没有回答我的问题。 我的家庭作业要求找到负数的补码。因此,我不是从正数开始,而是需要找出它的负数是什么,而
我正在用 C 语言编写一个模拟器,我想让 constantValuable ,即 65530 (0xFFFA) 成为 5 的二进制补码变量,但我似乎不太正确。下面是我希望完成此操作的 if 语句的示例
我正在使用 Visual Studio 2013。 最近我尝试了 ~ 运算符来求 1 的补码: int a = 10; cout << ~a << endl; 输出为-11 但是为了 unsigned
我这里有一个主题,来自“数字系统”,主题为“计算机组织与体系结构简介” 然后我遇到了这个主题,“自我补充代码” 它分为三个部分,如下所示: i)多余3(我理解这一部分,因为它要求我们在BCD中加3)
我有 -9 作为一个整数,我如何将其转换为 C 中的 5 位 2 补码整数?本质上是得到 10111? 我当前的代码是什么样的: char src2[3] = "-9"; int int_src2 =
The dataFile.bin is a binary file with 6-byte records. The first 3 bytes of each record contain the
我是一名优秀的程序员,十分优秀!