我非常喜欢杰夫关于斯巴达编程的帖子.我同意这样的代码是一种阅读的乐趣.不幸的是,我不太确定与他们一起工作一定会很愉快.
多年来,我一直在阅读并坚持"一行一线"的做法.当许多编程书籍使用示例代码来反驳这个建议时,我已经打了很好的战斗并坚持了下来:
while (bytes = read(...))
{
...
}
while (GetMessage(...))
{
...
}
Run Code Online (Sandbox Code Playgroud)
最近,出于更实际的原因,我提出了每行一个表达式 - 调试和生产支持.从生产中获取一个声明NullPointer异常的日志文件在"第65行",其中显示:
ObjectA a = getTheUser(session.getState().getAccount().getAccountNumber());
Run Code Online (Sandbox Code Playgroud)
令人沮丧,完全可以避免.没有抓住专家的代码可以选择"最可能"的对象是空的......这是一个真正的实际痛苦.
每行一个表达式在步进代码时也有很大帮助.我是在假设大多数现代编译器可以优化掉我刚创建的所有多余的临时对象的情况下练习的...
我试着整洁 - 但是用明确的对象混乱我的代码确实有时会感到费力.它通常不会使代码更易于浏览 - 但是在生产中跟踪事物或者通过我或他人的代码时,它确实派上了用场.
你提倡什么样的风格,你能在实际意义上理顺它吗?
在过去,我问了一个关于复位的问题,以及如何将高时钟频率分解为一系列较低时钟的方波频率,其中每个输出是彼此的谐波,例如第一个输出是10 Hz,第二个是20 Hz等等
我收到了几个非常有用的答案,建议使用时钟使能引脚创建较低频率的惯例.
我发生了另一种选择; 使用不断递增的位数,并将该数字的最后x位作为时钟输出,其中x是输出的数量.
它在我的综合中起作用 - 但我很想知道 - 因为我从未在网上或在SO上提到它,我错过了一些意味着它实际上是一个糟糕的想法,我只是为了以后创造问题?
我知道对此的限制是我只能产生输入频率除以2的幂的频率,所以大部分时间它只能接近所需的输出频率(但仍然是正确的)订购).这种限制是不推荐的唯一原因吗?
非常感谢!
大卫
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
use IEEE.math_real.all;
ENTITY CLK_DIVIDER IS
GENERIC(INPUT_FREQ : INTEGER; --Can only divide the input frequency by a power a of 2
OUT1_FREQ : INTEGER
);
PORT(SYSCLK : IN STD_LOGIC;
RESET_N : IN STD_LOGIC;
OUT1 : OUT STD_LOGIC; --Actual divider is 2^(ceiling[log2(input/freq)])
OUT2 : OUT STD_LOGIC); --Actual output is input over value above
END CLK_DIVIDER;
architecture …
Run Code Online (Sandbox Code Playgroud) 下一篇文章很长,但是由于我已经有一个多月无法使SP605板与DDR3正确交互,因此希望这对在我遇到相同情况的其他人也很有用。我可以肯定的是一个简单的配置或概念性错误,但我很乐意尽快解决此问题。
===场景===
我创建了一个USB-UART接口来与FPGA通信并控制DDR3。使用ISE中的IP生成器,我生成了MIG包装器,然后设计了内存接口控制器。但是,我参考了手册ug388和ug416,但是我无法使DDR3发挥预期的作用。
===问题陈述===
通过读写命令的突发长度,我能够从DDR3取回数据,但是寻址方案似乎不正确,因为数据在地址0和1、2和3、4和5中重复等等。另外,例如,每当我写入地址0时,都不会改变。然后,当我写入地址1时,地址0和1都用我刚刚发送的数据值更新。由于这种耦合效应,我似乎正在“丢失”一半的存储空间。
=== DDR3 IP配置===
下面列出了使用IP生成器的DDR3的设置-考虑到SP605板的情况。总之,我激活了DDR3 Bank 3并将Port0配置为32位双向。
内存选择:
启用AXI界面:未选中
使用扩展的MCB性能范围:未选中
存储区3的内存类型:DDR3 SDRAM
bank 1的内存类型:无
C3的选项– DDR3 SDRAM
频率:400 MHz
内存部分:MTJ41J64M16XX-187E
C3 – DDR3 SDRAM的内存选项
输出驱动器阻抗控制:RZQ / 6
RTT(标称)– ODT:RZQ / 4
自动自我刷新:已启用
C3的端口配置– DDR3 SDRAM
两个32位双向和四个32位单向端口
端口0:选中
端口1:未选中
Port2:未选中
端口3:未选中
Port4:未选中
端口5:未选中
内存地址映射选择:行库列
C3的FPGA选项– DDR3 SDRAM
内存接口引脚端接:校准的输入端接
选择RZQ引脚位置:R7
选择ZIO引脚位置:W4
内存控制器的调试信号:禁用
系统时钟:差分
===数据结构===
我从Matlab发送了一个64位命令,该命令应根据此命令中提供的地址和数据写入或读取DDR3。
wire [00:00] cmd_instruction = usb_data[63:63]; // ‘0’ = write; ‘1’ = read
wire [27:00] cmd_address = usb_data[62:37]; // 26-bit address
wire [31:00] cmd_data …
Run Code Online (Sandbox Code Playgroud) 有没有办法缩短java中的类型名称.类似于c ++中的typedef或类似命名空间的用法?
例如,如果我有类型"org.w3c.dom.Node",我不想
每次都写这个全名,但也不想对整个文件进行导入,
只是localy定义的类型"节点"在一个方法上是"org.w3c.dom.Node"?
我在大学课程中使用 VHDL 进行了一段时间的开发,我认为我了解它的工作原理,但有时我意识到我实际上并不了解它。
这是我的问题:
正如我所理解的,如果一个信号在进程的敏感列表中,那么只要该信号改变值,该进程就会“执行”。
所以我问,这2段代码有什么区别:
process(clk) is
begin
if(clk = '1') then
--Do Something
end if;
end process;
Run Code Online (Sandbox Code Playgroud)
和
process(clk) is
begin
if(rising_edge(clk)) then
--Do Something
end if;
end process;
Run Code Online (Sandbox Code Playgroud)
他们不应该表现得一样吗?
我正在尝试处理输出到DVI芯片的像素数据.使用各种时钟频率是因为DVI芯片寄存器是使用I2C编程的(因此需要时钟<500 KHz) - 来自时钟分频器.
DVI芯片需要一个40 MHz的差分像素时钟,然而,DVI每半个显示半个字节,因此每半个周期需要另外80 MHz的时钟将每一半像素推到数据线上,这些都是来自DCM.
这导致了各种各样的问题.我试图只使用双像素时钟速率交换像素的每一半,但是我得到了错误:
This design contains a global buffer instance, <out2_bufg>,
driving the net, <pxlclk_p_int>, that is driving the following (first 30)
non-clock load pins.
所以我在DCM的输出和使用信号的组件之间添加了一个BUFG元素 - 但它没有改变任何东西,而是现在在BUFG的输入和输出上抛出两次错误.
我的代码如下; 我试图删除与时钟无关的不相关的东西,但它仍然很长!
编辑1:我添加了块,当添加到系统时,导致错误(之前没有)它在第二个代码块中!我目前正在研究差分信号的其他建议,并在完成后再次编辑!
非常感谢,
大卫
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY I2CBus IS
PORT(
SYSCLK_N : IN STD_LOGIC; --system 200MHz differential clock
SYSCLK_P : IN STD_LOGIC;
BTN : IN STD_LOGIC; -- to manually change reset
LED : OUT STD_LOGIC_VECTOR(3 …
Run Code Online (Sandbox Code Playgroud) 从我浏览的内容来看,一旦FPGA断电,您就必须对其进行编程。但是我正在尝试使用Verilog实现基于FPGA的安全系统。在这种情况下,我希望系统的密码被永久存储,即即使电源关闭也不应删除该密码。如果程序也可以存储也很好。我是FPGA的入门者。所以,请告诉我该怎么做。该设备是XC3S400 Spartan 3系列。
有没有办法从已经编程的FPGA板导入代码,在这种情况下,它是一个Spartan 3E板.也就是说,Verilog代码已经上传到它,所以我想的方式进行接收的代码早在电脑,因为我已经失去了副本.我上传了Xilinx ISE的代码,但我不确定是否可以采用相反的方式.
我真的很感激投入.
我正在使用FPGA Spartan 2板并想要计算从键盘按下的键这是我的VHDL代码:
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 Keyboard IS
PORT(CLOCK : IN STD_LOGIC;
RESET : IN STD_LOGIC;
RK : IN STD_LOGIC_VECTOR(3 DOWNTO 1);
DE : OUT STD_LOGIC_VECTOR(3 DOWNTO 1);
Invalid_Key : OUT STD_LOGIC := '0';
Seg1 : OUT STD_LOGIC_VECTOR(7 Downto 0);
Seg2 : OUT STD_LOGIC_VECTOR(7 Downto 0);
LEDRow1 : OUT STD_LOGIC_VECTOR(7 Downto 0);
LEDRow2 : OUT STD_LOGIC_VECTOR(7 Downto 0);
Key : OUT STD_LOGIC_VECTOR(0 TO 15));
END Keyboard;
Architecture Behavier OF Keyboard IS …
Run Code Online (Sandbox Code Playgroud) 我有两个模块
以下代码段最相关,并附在下面:
顶层模块:
计数器counter1(...,error_count); lcd lcd1(...,error_count);
计数器模块:
模块计数器(...,error_count); ... 输出寄存器[31:0] error_count = 0; ... //每个时钟周期更新计数器 终端模块
LCD模块:
模块LCD(...,error_count); ... 输入[31:0] error_count; ... //用于在LCD上显示的error_count 终端模块
此代码有什么问题?显示屏仅输出0作为输出。我传递向量的方式有什么问题吗?
附加信息:我正在使用Xilinx Spartan 3E入门套件来测试此代码。LCD代码很好,我已经使用本地计数器(reg [31:0])对其进行了测试。
我想把数字数据的样本外部提交给FPGA spartan 3.我想最初采用1000个样本/秒.如何在vhdl编码中选择时钟频率?
谢谢.