fpga编程问题,这些代码怎么理解,求注释

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fpga编程问题,这些代码怎么理解,求注释相关的知识,希望对你有一定的参考价值。

library lpm;
use lpm.lpm_components.all;

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity ccmul is
generic(w2:integer:=17; --乘法数位宽
w1:integer:=9; --c+s和的位宽
w:integer:=8); --输入位宽
port(clk:std_logic; --输出寄存器的时钟
x_in,y_in,c_in:in std_logic_vector(w-1 downto 0);
cps_in,cms_in:in std_logic_vector(w1-1 downto 0);
r_out,i_out:out std_logic_vector(w-1 downto 0));
end ccmul;

architecture rotate of ccmul is
signal x,y,c:std_logic_vector(w-1 downto 0);
signal r,i,cmsy,cpsx,xmyc:std_logic_vector(w2-1 downto 0);
signal xmy,cps,cms,sxtx,sxty:std_logic_vector(w1-1 downto 0);--x-y结果

begin
x<=x_in;
y<=y_in; --j*y
c<=c_in; --cos
cps<=cps_in; --cos+sin
cms<=cms_in; --cos-sin
process
begin
wait until clk='1';
r_out<=r(w2-3 downto w-1); --缩放和触发
i_out<=i(w2-3 downto w-1); --输出
end process;

sxtx<=x(x'high) & x;
sxty<=y(y'high) & y;

sub_1:lpm_add_sub -- x-y
generic map(lpm_width=>w1,
lpm_direction=>"sub",
lpm_representation=>"signed")
port map(dataa=>sxtx,
datab=>sxty,
result=>xmy);
mul_1:lpm_mult --xmyc=(x-y)*c
generic map(lpm_widtha=>w1,
lpm_widthb=>w,
lpm_widthp=>w2,
lpm_widths=>w2,
lpm_representation=>"signed")
port map(dataa=>xmy,
datab=>c,
result=>xmyc);

mul_2:lpm_mult --cmsy=(c-s)*y
generic map(lpm_widtha=>w1,
lpm_widthb=>w,
lpm_widthp=>w2,
lpm_widths=>w2,
lpm_representation=>"signed")
port map(dataa=>cms,
datab=>y,
result=>cmsy);

mul_3:lpm_mult --cpsx=(c+s)*cpsx
generic map(lpm_widtha=>w1,
lpm_widthb=>w,
lpm_widthp=>w2,
lpm_widths=>w2,
lpm_representation=>"signed")
port map(dataa=>cps,
datab=>x,
result=>cpsx);

sub_2:lpm_add_sub -- i=(c-s)*x-(x-y)*c
generic map(lpm_width=>w2,
lpm_direction=>"sub",
lpm_representation=>"signed")
port map(dataa=>cpsx,
datab=>xmyc,
result=>i);

add_1:lpm_add_sub -- r=(x-y)*c+(c-s)*y
generic map(lpm_width=>w2,
lpm_direction=>"add",
lpm_representation=>"signed")
port map(dataa=>cmsy,
datab=>xmyc,
result=>r);

end rotate;

参考技术A 还是用Verilog HDL 吧,形象又简单,VHDL逻辑思维的痕迹太少了,Verilog在形式上有些像C语言,所以比较好理解。

java方面 是个打印菱形的程序,本人是新手不太理解,求高手注释,详细解释一下,谢了!

public class Var_02
public static void main(String args[])
for(int i=1;i<=7;i+=2)
for(int kong=7;kong>i-1;kong--)
System.out.print(" ");

for(int xing=1;xing<=i;xing++)
System.out.print("* ");

System.out.println();

for(int j=1;j<=5;j+=2)
for(int kong1=1;kong1<j+3;kong1++)
System.out.print(" ");

for(int xing1=5;xing1>=j;xing1--)
System.out.print("* ");

System.out.println();


public class AvoidFile_old
public static void main(String[] args)
//定义一个字符串filepath为一个文件地址的绝对路径
String filepath = "d:/Test/myFile.txt";
/*
* args 这个字符串数组是保存运行main函数时输入的参数,也就是说你编译好了文件是这样运行的java AvoidFile_old xx yy
* 这表示你有两个参数:xx和yy args[0]为xx args[1]为yy
* 如果args的长度大于0,也就是说args数组中有字符串
* 那么就把args数组中的第一个字符串赋值给filepath
* 如果你没有在运行时输入参数,就是简单的运行的话此数组为空if下的语句不执行
* 我认为这段程序有点无厘头,就整个程序而言没有什么意义,可以不考虑,可能整个程序作为模块还有其他作用
* */
if(args.length>0)
filepath = args[0];

//通过将给定路径名字符串转换为抽象路径名aFile(aFile的值为d:/Test/myFile.txt)
//来创建一个新 File 实例。抽象路径名可以理解为输入的d:/Test/myFile.txt
File aFile = new File(filepath);
//FileOutputStream用于写入诸如图像数据之类的原始字节的流
FileOutputStream outputFile = null;
//判断此抽象路径名表示的文件是否是一个标准文件
if (aFile.isFile())
//如果是,创建一个newFile就为此标准文件 此时抽象路径名newFile为d:/Test/myFile.txt
File newFile = aFile;

do
//返回由此抽象路径名表示的文件名称给name。此时得到的name的值为myFile.txt
String name = newFile.getName();
//返回name中"."第一次出现处的索引给period,即myFile.txt根据.索引到的位置period为6(从0开始数)
int period = name.indexOf('.');
if(period == -1)
//period == -1表示给定的文件名不存在(表示你定义的String filepath = "d:/Test/.txt";是这样的或更不全)
/* newFile = new File(newFile.getParent(), extendName(name));表示
* extendName(name)请看程序下段private static String extendName(String name)的方法
* newFile.getParent()得到的是父目录,如果你输入的filepath = "d:/Test/.txt"
* 那么父目录为d:/Test
* 根据 parent(即newFile.getParent())路径名字符串和 child(extendName)路径名字符串创建一个新 File 实例
* 此时创建的实例文件所在路径为d:/Test/extendName(name).txt
* */
newFile = new File(newFile.getParent(), extendName(name));
else
/* 如果文件名不为空的话,
* 根据 parent(newFile.getParent())路径名字符串和 child(extendName) 路径名字符串创建一个新 File 实例
* newFile.getParent()返回newFile父目录的路径名字符串即d:/Test
* extendName()得到的是文件名+点,"d:/Test/myFile.txt"就是"myFile."
* name.substring(0, period))+ name.substring(period))表示
* 返回字符串name=myFile.txt的一个子字符串。该子字符串从指定的0处开始,直到索引最后位 - 1 处的字符第一次创建时
* 为myFile,第二次源目录创建时为myFile000
* 再+name.substring(period)得到一个 .
* */
newFile = new File(newFile.getParent(),
extendName(name.substring(0, period))
+ name.substring(period));

//如果aFile没有重新命名为newFile抽象路径名表示的文件,则循环上面的操作
while(!aFile.renameTo(newFile));


try
//文件已经创建则输出文件名
outputFile = new FileOutputStream(aFile);
System.out.println(aFile.getName()+" output stream created");
catch (FileNotFoundException e)
e.printStackTrace(System.err);

System.exit(0);

//定义方法extendName
private static String extendName(String name)
//把newName定义为动态可变字符串,这样newName可以随时改变,比如下面的newName.delete()方法
StringBuffer newName = new StringBuffer(name);
//获得digits是newName中除点之外的后三位字符串(因为name是文件名加点在上面已经讲了)
//substring方法返回的是 从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符
//所以点. 就不包在digits中,获得的是纯文件名
String digits = newName.substring(newName.length()-3,newName.length());
int number = 0;
try
/*此段程序为整个程序的最精彩之处,把digits转化为整型number,
* 如果在原路径中创建了一个同名时,会自动在文件明后加上000
* 然后通过下面这段程序在000上进行递增即++number
*
* */
number = Integer.parseInt(digits);
++number;
newName.delete(newName.length()-3,newName.length());
catch(NumberFormatException nfe)

//吧number转化为字符串型
digits = String.valueOf(number);
//做声明
assert digits.length() < 4;
/*
*
* */
return newName.append("000").replace(newName.length()-digits.length(),newName.length(), digits).toString();


//注:你必须在c盘中有Test文件夹存在才能运行,如果多次运行改程序那么在你的d:\Test文件夹下有myFile00*.txt文件
参考技术A 大半夜没事做,我给你来解释一下吧,解释完睡觉
第一个包含2个for循环的那个for循环,是打印,是打印正尖朝上的三角型
当i=1时
第一行打印7个空格,再打印一个星,然后打印一个换行,继续下一个for循环,也就是i=3的时候
这时候就是第2行,通过第一个for打印5个空格,再打印3个星
依次循环到第4行,打印一个空格,7个星,这样一个三角型就出来了
下面的包含矿个for循环的for循环是打印倒过来的三角型,组合起来,就是一个菱形了。
当j=1时,第5行打印3个空格,5个星,然后依次循环2次,直到第7行结束,也就是和第一行一样,打印7个空格,一个星
输出结果是这样
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*本回答被提问者采纳

以上是关于fpga编程问题,这些代码怎么理解,求注释的主要内容,如果未能解决你的问题,请参考以下文章

什么是fpga

Python网络编程TCP服务器端问题,如图,为啥没报错也没输出?代码哪里有问题,求大神

SAP CRM BOL编程基础,代码+详细注释

java方面 是个打印菱形的程序,本人是新手不太理解,求高手注释,详细解释一下,谢了!

在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?

FPGA之初认识