verilog报告(打印版)
- 格式:doc
- 大小:293.50 KB
- 文档页数:9
西安邮电大学Verilog HDL大作业报告书学院名称:电子工程学院学生姓名:专业名称:电子信息工程班级:实验一异或门设计一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。
2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真实验描述如下:module my_and(a_out,a1,a2);output a_out;input a1,a2;wire s1;nand(s1,a1,a2);nand(a_out,s1,1'b1);endmodulemodule my_not(n_out,b);output n_out;input b;nand(n_out,b,1'b1); endmodulemodule my_or(o_out,c1,c2);output o_out;input c1,c2;wire s1,s2;nand(s1,c1,1'b1);nand(s2,c2,1'b1);nand(o_out,s1,s2); endmodulemodule MY_XOR(z,x,y);output z;input x,y;wire a1,a2,n1,n2;my_not STEP01(n1,x);my_not STEP02(n2,y);my_and STEP03(a1,n1,y);my_and STEP04(a2,n2,x);my_or STEP05(z,a1,a2); Endmodulemodule stimulus;reg X,Y;wire OUTPUT;MY_XOR xor01(OUTPUT,X,Y);initialbegin$monitor($time,"X=%b,Y=%b --- OUTPUT=%b\n",X,Y,OUTPUT);endinitialbeginX = 1'b0; Y = 1'b0;#5 X = 1'b1; Y = 1'b0;#5 X = 1'b1; Y = 1'b1;#5 X = 1'b0; Y = 1'b1;endendmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。
1.PWM学会了模块间参数的调用,了解了pwm的原理,可以根据需求对不同的div进行设定从而获得一个条件限制从而获得一些不同的效果。
2. 8位桶形移位器波形这里用了一个case来表示移动的位数同时也能表示几种不同的情况。
每变换一个数或者位数便重新进行判断,从而得到准确的结果。
移位在之后的任务中显得比较重要。
所以使用快速准确的移位器可以较多地节省时间。
3.FIFO4.流水线加法器波形这里采用的是两级流水。
并在其中添加了拼接从而使得结果更加准确。
这里有一个问题。
我本来设定的firsta,b是两位的,但是相加的时候发生了溢出。
所以,把它设定为三位,这样进位就可以保存在多余出的那一位中。
做完这道题让我对流水线有了更深的理解。
5.除法器I波形这是个整数除法器,用的是辗转相减,这里用了case来实现循环,这样就使得原本比较棘手的while循环更加简便。
也可以较为条理的顺序执行。
但是,这种方法似乎不是很高效,因为,结果的出现有明显的延迟,而且,随着被除数和除数的改变,延迟也会有所改变。
所以,我采用了以下方法。
6.除法器II波形这个除法器是通过移位来实现的,逻辑较为复杂,尤其是,for循环块中的逻辑,想了很长时间。
但是,它更为高效,因为是通过按位实现。
所以,我在下面的流水线除法器中,使用了这个方法。
7.流水线除法器这是流水线除法器,采用九级流水,其实,是把上面的循环,分成了九个步骤。
但是,这其中的参数处理起来比较棘手,所以我使用了很多寄存器。
九级流水也使得吞吐量大幅提高。
7个操作数由原来的9个周期变为现在的2.285个周期。
8.阵列除法器波形;。
Verilog实验报告班级:学号:姓名:实验1 :用 Verilog HDL 程序实现直通线1 实验要求:(1) 编写一位直通线的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 建议用模式 52 试验程序:module wl(in,out);input in;output out;wire out;assign out=in;endmodule3 测试基准:`include “wl.v”module wl_tb;reg in_tb;wire out_tb;initialbeginin_tb =0;#100 in_tb =1;#130 in_tb =0;endendmodule4 仿真图形:实验2 :用 Verilog HDL 程序实现一位四选一多路选择器1实验要求:(1) 编写一位四选一多路选择器的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4)建议用模式 52 试验程序:module mux4_to_1 (out,i0,i1,i2,i3,s1,s0);output out;input i0,i1,i2,i3;input s1, s0;reg out;always @ (s1 or s0 or i0 or i1 or i2 or i3)begincase ({s1, s0})2'b00: out=i0;2'b01: out=i1;2'b10: out=i2;2'b11: out=i3;default: out=1'bx;endcaseendendmodule3 测试基准:`include "mux4_to_1.v"module mux4_to_1_tb1;reg ain,bin,cin,din;reg[1:0] select;reg clock;wire outw;initialbeginain=0;bin=0;cin=0;din=0;select=2'b00;clock=0;endalways #50 clock=~clock;always @(posedge clock)begin#1 ain={$random} %2;#3 bin={$random} %2;#5 cin={$random} %2;#7 din={$random} %2;endalways #1000 select[0]=!select[0];always #2000 select[1]=!select[1];mux4_to_1 m(.out(outw),.i0(ain),.i1(bin),.i2(cin),.i3(din),.s1(select[1]),.s0(select[0])); endmodule4 仿真图形:实验3:用 Verilog HDL 程序实现十进制计数器1实验要求:(1) 编写十进制计数器的 Veirlog HDL 程序. 有清零端与进位端, 进位端出在输出为 9 时为高电平.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2 实验程序:module counter_10c (Q, clock, clear, ov);output [3:0] Q;output ov;input clock, clear;reg [3:0] Q;reg ov;initial Q=4'b0000;always @ (posedge clear or negedge clock)beginif (clear)Q<=4'b0;else if (Q==8)beginQ<=Q+1;ov<=1'b1;endelse if (Q==9)beginQ<=4'b0000;ov<=1'b0;endelsebeginQ<=Q+1;ov<=1'b0;endendendmodule3 测试基准:`include"./counter_10c.v"module counter_10c_tb;wire[3:0] D_out;reg clk,clr;wire c_out;reg[3:0] temp;initialbeginclk=0;clr=0;#100 clr=1;#20 clr=0;endalways #20 clk=~clk;counter_10c m_1(.Q(D_out),.clear(clr),.clock(clk),.ov(c_out)); endmodule4 仿真波形:实验4 :用 Verilog HDL 程序实现序列检测器1 实验要求:、(1) 编写序列检测器的 Veirlog HDL 程序. 检测串行输入的数据序列中是否有目标序列5'b10010, 检测到指定序列后, 用一个端口输出高电平表示.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2试验程序:module e15d1_seqdet( x, z, clk, rst);input x,clk, rst;output z;reg [2:0] state;wire z;parameter IDLE = 3 'd0,A = 3'd1,B = 3'd2,C = 3'd3,D = 3'd4,E = 3'd5,F = 3'd6,G = 3'd7;assign z =(state==D && x==0)?1:0;always @(posedge clk or negedge rst)if(!rst)beginstate<=IDLE;endelsecasex(state)IDLE: if(x==1)state<=A;else state<=IDLE;A: if (x==0)state<=B;else state<=A;B: if (x==0)state<=C;else state<=F;C: if(x==1)state<=D;else state<=G;D: if(x==0)state<=E;else state<=A;E: if(x==0)state<=C;else state<=A;F: if(x==1)state<=A;else state<=B;G: if(x==1)state<=F;else state <=G;default: state<=IDLE;endcaseendmodule3测试基准:`include"e15d1_seqdet.v"`timescale 1ns/1ns`define halfperiod 20module e15d1_seqdet_tb;reg clk, rst;reg [23:0] data;wire z;reg x;initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data= 20 'b1100_1001_0000_1001_0100;#(`halfperiod*1000) $stop;endalways #(`halfperiod) clk=~clk;always @ (posedge clk)begin#2 data={data[22:0],data[23]};x=data[23];ende15d1_seqdet m(.x(x),.z(z),.clk(clk),.rst(rst)); endmodule4仿真波形:。
Verilog实现密码箱1.功能概述小脚丫开发板的有4位拨码开关,可以表示数字0-9,有两个七段数码管,所以密码设为两位(00—99),初始密码00,利用四位拨码开关(sw)输入密码,,按下个位确认按键(low),在数码管上显示个位数字;再次输入密码,按下十位确认按键(high),在数码管上显示十位数字。
按下确认按键(enter),比较密码正误,若正确,实现开锁功能,用led8灯亮表示;错误,实现报错功能,用led1灯亮表示;连续错三次,实现警报功能,用8个灯全亮表示,此时只有重置(rst)才能重新输入密码。
初始密码为21。
为保证安全性,只有在开锁状态下,才可修改密码,修改拨码开关数值,按下个位确认按键(low),设置新密码个位,再次修改拨码开关数值,按下个位确认按键(high),设置新密码十位(实际上两个位密码修改与输入顺序不影响)。
再按下重置键(rst),即可重新输入密码。
同时在使用按键时,注意到了消抖。
2.效果展示密码错误密码正确修改后密码正确视频展示(双击播放)3.代码分析一、密码显示在数码管上always@(*)//数码管显示控制模块begincase(code_low)4'd0:seg_led1=9'b000111111;//数码管1显示0 4'd1:seg_led1=9'b000000110;//14'd2:seg_led1=9'b001011011;//24'd3:seg_led1=9'b001001111;//34'd4:seg_led1=9'b001100110;//44'd5:seg_led1=9'b001101101;//54'd6:seg_led1=9'b001111101;//64'd7:seg_led1=9'b000000111;//74'd8:seg_led1=9'b001111111;//84'd9:seg_led1=9'b001101111;//9default:seg_led1=9'b100111111;//0endcasecase(code_high)4'd0:seg_led2=9'b000111111;//数码管2显示0 4'd1:seg_led2=9'b000000110;//14'd2:seg_led2=9'b001011011;//24'd3:seg_led2=9'b001001111;//34'd4:seg_led2=9'b001100110;//44'd5:seg_led2=9'b001101101;//54'd6:seg_led2=9'b001111101;//64'd7:seg_led2=9'b000000111;//74'd8:seg_led2=9'b001111111;//84'd9:seg_led2=9'b001101111;//9default:seg_led2=9'b100111111;//0endcaseend二、密码比对判断always @(posedge clk) //密码判断beginif(!rst)beginwrong_cnt<=2'b00; //初始错误次数为0code_low<=4'b0000;code_high<=4'b0000;led<=8'b11111111;endelse if(low_d)begincode_low<=sw;endelse if(high_d)begincode_high<=sw;endelse if(enter_d)beginif(wrong_cnt!=2'd2)beginif((code_low==Y&&code_high==X)||(code_low==newcode_low& &code_high==newcode_high))beginled<=8'b01111111; //密码正确,led8亮wrong_cnt<=2'd0;endelsebeginled<=8'b11111110; //密码错误,led1亮错误次数加一wrong_cnt<=wrong_cnt+1;endendelseled<=8'b00000000; //密码输错三次,报警endend三、密码修改实现//修改控制模块always @(posedge clk)beginif(!rst)change<=0;else if(led<=8'b01111111)change<=1;if(change==1&&high_d)beginnewcode_high<=sw;endelse if(change==1&&low_d)beginnewcode_low<=sw;endendendmodule四、按键消抖实现//按键消抖模块module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。
它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。
本实验报告将介绍我在学习Verilog过程中进行的实验内容和所获得的结果。
实验一:基本门电路设计在这个实验中,我使用Verilog设计了基本的逻辑门电路,包括与门、或门和非门。
通过使用Verilog的模块化设计,我能够轻松地创建和组合这些门电路,以实现更复杂的功能。
我首先创建了一个与门电路的模块,定义了输入和输出端口,并使用逻辑运算符和条件语句实现了与门的功能。
然后,我创建了一个测试模块,用于验证与门的正确性。
通过输入不同的组合,我能够验证与门的输出是否符合预期。
接下来,我按照同样的方法设计了或门和非门电路,并进行了相应的测试。
通过这个实验,我不仅学会了使用Verilog进行基本门电路的设计,还加深了对逻辑电路的理解。
实验二:时序电路设计在这个实验中,我学习了如何使用Verilog设计时序电路,例如寄存器和计数器。
时序电路是一种具有状态和时钟输入的电路,能够根据时钟信号的变化来改变其输出。
我首先设计了一个简单的寄存器模块,使用触发器和组合逻辑电路实现了数据的存储和传输功能。
然后,我创建了一个测试模块,用于验证寄存器的正确性。
通过输入不同的数据和时钟信号,我能够观察到寄存器的输出是否正确。
接下来,我设计了一个计数器模块,使用寄存器和加法电路实现了计数功能。
我还添加了一个复位输入,用于将计数器的值重置为初始状态。
通过测试模块,我能够验证计数器在不同的时钟周期内是否正确地进行计数。
通过这个实验,我不仅学会了使用Verilog设计时序电路,还加深了对触发器、寄存器和计数器的理解。
实验三:组合电路设计在这个实验中,我学习了如何使用Verilog设计组合电路,例如多路选择器和加法器。
组合电路是一种没有状态和时钟输入的电路,其输出只取决于当前的输入。
Verilog实验报告实验一简单组合逻辑电路的设计一实验要求1.用verilog HDL语言描写出简单的一位数据比较器及其测试程序;2.用测试程序对比较器进行波形仿真测试;画出仿真波形;3.总结实验步骤和实验结果。
二实验原理与内容4.这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign结构。
注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
5.模块源代码测试模块:6.波形图:四结实验步骤和实验结果由图可看出,每当输入的电位值不同时输出为0,这与实验要求一致,相同时输出为1,故此程序是可行的。
实验三在verilog HDL中使用函数一实验要求1.掌握函数在模块中的使用2.用测试程序进行波形仿真测试;画出仿真波形3.总结实验步骤和实验结果二实验原理与内容与一般的程序设计语言一样;verilog HDL也可以使用函数已是应对不同变量采取同一运算的操作。
verilog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。
模块源代码:module ex3(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk)beginif(!reset)result <= 0;elsebeginresult <= n*factorial(n)/((n*2)+1);endendfunction[31:0] factorial;input[3:0] operand;reg[3:0] index;beginfactorial = operand ? 1:0;for(index = 2;index <= operand;index = index+1) factorial = index*factorial;endendfunctionendmodule`timescale 1ns/100ps`define clk_cycle 50module ex3_t();reg[3:0] n,i;reg reset,clk;wire[31:0] result;initialbeginn=0;reset=1;clk=0;#100 reset=0;#100 reset = 1;for(i=0;i <= 15;i=i+1)begin#200 n=i;end#100 $stop;endalways #`clk_cycle clk =~ clk;ex3 ex30(.clk(clk),.n(n),.result(result),.reset(reset)); always @(negedge clk)$display("at n=%d,result=%d",n,result);endmodule波形图:实验四在verilog HDL中使用任务一实验要求1.掌握任务在结构化verilog HDL设计中的应用2.用测试程序进行波形仿真测试;画出仿真波形3.总结实验步骤和实验结果二实验原理与内容仅有函数并不能满足verilog HDL中的运算需求。
目录实验一 (2)实验二 (8)实验三 (14)实验四 (27)实验一实验目的:熟悉硬件开发流程,掌握Modelsim设计与仿真环境,学会简单组合逻辑电路、简单时序逻辑电路设计,不要求掌握综合和综合后仿真。
实验内容:必做实验:练习一、简单的组合逻辑设计练习二、简单分频时序逻辑电路的设计选做实验:选做一、练习一的练习题选做二、7段数码管译码电路练习一、简单的组合逻辑设计描述一个可综合的数据比较器,比较数据a 、b的大小,若相同,则给出结果1,否则给出结果0。
实验代码:模块源代码:module compare(equal,a,b);input a,b;output equal;assign equal=(a==b)?1:0;endmodule测试模块源代码:`timescale 1ns/1ns`include "./compare.v"module t;reg a,b;wire equal;initialbegina=0;b=0;#100 a=0;b=1;#100 a=1;b=1;#100 a=1;b=0;#100 a=0;b=0;#100 $stop;endcompare m(.equal(equal),.a(a),.b(b));endmodule实验波形练习二、简单分频时序逻辑电路的设计用always块和@(posedge clk)或@(negedge clk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果。
实验代码:模块源代码:module halfclk(reset,clkin,clkout);input clkin,reset;output clkout;reg clkout;always@(posedge clkin)beginif(!reset) clkout=0;else clkout=~clkout;endendmodule测试模块源代码:`timescale 1ns/100ps`define clkcycle 50module tt;reg clkin,reset;wire clkout;always#`clkcycle clkin=~clkin;initialbeginclkin=0;reset=1;#10 reset=0;#110 reset=1;#100000 $stop;endhalfclk m0(.reset(reset),.clkin(clkin),.clkout(clkout));endmodule练习题1:设计一个字节(8位)的比较器。
HDL实验报告专业电子科学与技术姓名学号指导老师1 实验一Modelsim仿真软件的使用1.1 实验目的(1)熟悉Modelsim 软件;(2)掌握Modelsim 软件的编译、仿真方法;(3)熟练运用Modelsim 软件进行HDL 程序设计开发。
1.2 实验步骤(1)学习使用Modelsim软件;(2)分析原理及功能;(3)用Verilog HDL编写程序;(4)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
1.3 实验内容用Verilog HDL 程序实现一个异或门,Modelsim 仿真,观察效果。
1.4.1 程序module my_xor(ina,inb,out);input ina,inb;output out;assign out=ina^inb;endmodulemodule t_xor;reg ina,inb;wire out;initialbeginina=1'b0;forever #20 ina=~ina;endinitialbegininb=1'b0;forever #10 inb=~inb;endmy_xor tt(.ina(ina),.inb(inb),.out(out));endmodule2 实验二简单组合电路设计2.1 实验目的(1)掌握基于Modelsim 的数字电路设计方法;(2)熟练掌握HDL 程序的不同实现方法2.2 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
2.3 实验内容设计一个三人表决器(高电平表示通过) ,实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。
使用Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真(要求:至少使用两种方法实现上述实验内容和testbench)。
2014-2015-2-G02A3050-1电子电路设计训练(数字EDA部分)实验报告(2015 年5 月20 日)教学班学号姓名组长签名成绩自动化科学与电气工程学院目录目录 .......................................................错误!未定义书签。
实验一、简单组合逻辑和简单时序逻辑............................错误!未定义书签。
实验任务1——简单组合逻辑...........................错误!未定义书签。
实验要求.........................................错误!未定义书签。
模块的核心逻辑设计...............................错误!未定义书签。
测试程序的核心逻辑设计...........................错误!未定义书签。
仿真实验关键结果及其解释.........................错误!未定义书签。
实验任务2——简单时序逻辑...........................错误!未定义书签。
实验要求.........................................错误!未定义书签。
模块的核心逻辑设计...............................错误!未定义书签。
测试程序的核心逻辑设计...........................错误!未定义书签。
仿真实验关键结果及其解释.........................错误!未定义书签。
实验小结.............................................错误!未定义书签。
实验二、条件语句和always过程块...............................错误!未定义书签。
一、实验目的通过此设计的编程和下载运行,初步掌握Verilog HDL语言的always 块语句及基本编程结构。
二、实验过程(1)新建工程;通过“file”→“new project wizard…”菜单命令启动新项目向导,利用向导,建立一个新项目。
(2)输入设计程序在file菜单下,单击“new”命名,弹出对话框,选择Verilog HDL File 选项,建立Verilog HDL文件,输入下面程序:module liushuideng(ledout,clk);output[8:0]ledout;input clk;reg[8:0]ledout;reg[23:0]counter;initialledout=8'b11111111;always@(posedge clk)begincounter=counter+1;if(counter==24'b110000000000000000000000)beginledout=ledout<<1;if(ledout==8'b00000000)ledout=8'b11111111;counter=0;endendendmodule(3)指定管脚和设置不用引脚启动pin planner工具,弹出对话框,在“location”列,选择要分配的位置,为每个电路端子都分配适当的脚位。
在Assignments菜单下,单击Device…命令,进入Device & Pin Options对话框,在切换到Unused Pins页,在Reserved all unused pins栏目中,选择As input tri-stated,回到Setting对话框,单击“确定”。
(4)编译在processing菜单下,单击Start Compilation命令,开始编译项目,若编译成功,单击“确定”。
(5)仿真在file菜单下,单击“new”,弹出对话框,切换到other files页。
Verilog大作业电科一班张威3006204023 徐建龙3006204019 万杰3006204015 王腾星3006204016电科二班刘欢3006204037源代码:`timescale 1ns/100psmodule transport;parameter longsize=65554;reg [24:1] meme[1:longsize],b;integer e,m,n,i,j,w;initialbeginw=$fopen("lena.bmp","rb");e=$fread(meme,w);$fclose(w);m=$fopen ("lena.txt");n=0;repeat (18)begin#100;n=n+1;b=meme[n];$fwrite (m,"%h",b);endfor(j=0;j<=255;j=j+1)for(i=1;i<=256;i=i+1)begin#100;n=18+256*i-j;b=meme[n];$fwrite(m,"%h",b);end$fclose(m);endendmodule仿真后Objects中的数值:仿真后波型:转换后在lena.txt中的数值:使用到的软件:在winhex中的数值:原图:经VERILOG转换后的图:在中间过程中由于算法错误产生的错误结果:设计说明书:1.先用$fread系统任务将BMP图片的二进制代码读入存储器meme中;2.读出的二进制代码的前54个字节是BMP位图的基本代码,因此在对图片进行翻转时前54个字节的位置不变。
后面为256*256个像素,每24位代表一个像素,BMP文件的数据是从左到右,从下到上的。
也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推,最后得到的是最上面一行的最右一个象素。
所以要实现图片的顺时针旋转应该把meme中像素逆时针旋转90度。
3.首先用repeat语句每延迟100ns把meme中的前十八个单元经缓存器b依次读入lena.txt 中。
然后用for语句每延迟100ns把翻转后256*256个像素经缓存器b依次读入lena.txt中。
4.用WinHex软件把得到的lena.txt文件转换成二进制数据另存为.Bmp文件即可得到翻转后的图片。
张威工作总结在完成本次verilog大作业的过程中,我不仅学到了很多只靠读书学不到的知识,而且体会到了团队协作的力量,以下做一简要总结:在这次作业中,我们首先进行分工合作,我和徐建龙负责bmp图像方面的工作,首先我们通过在网上和图书馆查阅资料,了解了bmp格式图像的基本知识,以便编写具体算法实现图像的翻转。
在对bmp格式文件有了一定掌握后,我们首先尝试用c++语言将其转换为txt 文件的格式,但是在查阅了相关资料后,发现这种方法过于复杂,因此最终放弃了这个思路。
随后我们查阅资料发现可以直接利用verilog的系统任务$fread即可对bmp文件进行操作,再结合文件输出任务$fopen\$fdisplay\$fclose将bmp文件打开并通过翻转算法转换后再写入txt文件,最后用软件WinHex将其转换为2进制文件并另存为bmp格式,即完成了翻转工作。
在这个过程中,我对课上学到的语句有了更深的理解,并将其应用到了实际工程中,使自己的运用能力得到了很好的锻炼,并且,我对Modelsim仿真软件也有了一定的了解,其基本操作已经较熟练的掌握,对其中一些细节问题,如仿真时间的选取等也有了自己的理解。
实践出真知,通过在软件上反复改程序、跑程序我也学会了很多只看书本发现不了的问题,锻炼了自己的解决问题能力。
最后,我还想感谢我的队友们,这次作业的完成使我们共同努力的结果,我真正感受到了团队的力量,也体会到了老师为什么一定要求必须结对完成的良苦用心。
在做工程的过程中,我们曾经对算法,流程等诸多问题产生过分歧,在屡次失败后,我们也曾想过放弃,但是我们最终团结一致,共同努力完成了作业,在图片成功翻转的那一霎那,所有的辛苦都有了回报,我们真正明白了什么叫teamwork!刘欢verilog大作业工作报告在团队成员的合作下,经历了许多困难,终于完成了verilog的大作业,虽然过程并不是和想象中的一样,而且作业也与老师要求的有所差距,但是在紧张的考试复习中,还是努力把这个作业完成了,并且从中学习到了许多关于verilog的使用与仿真的知识,这对于今后的学习是有很大的帮助的。
在整个完成作业的过程中,遇到了很多困难:1.首先遇到的困难就是BMP文件的读入,后来在查阅了相关资料以后,发现用verilog中的系统函数可以直接将BMP文件以二进制的形式读入。
2.第二个困难就是实现顺时针旋转90度的算法,这个地方的主要问题在于,很容易混淆行与列的关系,导致中间一次居然出现了扭曲的lena图像,后来在大家的集体智慧下终于解决了这个问题。
3.第三个困难也可以说是整个大作业中最困难的就是仿真时总是出不了波形,这里面的第一个问题就是只能显示端口变量的值,后来在网上搜索以后,更改了verilog.ini中的一个数值,问题得到了解决。
第二个问题是仿真时间的确定,开始的时候无论如何也无法生成一个完整的二进制txt 文本文件,几经周折才发现是仿真时间选择过小,以至于整个转换过程无法全部完成,这样,在增大了仿真时间以后问题才得到了解决。
4.因为c语言知识的欠缺,第四个困难就是生成的二进制文本文件无法转换成最后的BMP文件,这样利用网络的搜索功能,用一个进制转换的小软件WinHex成功的解决了这个问题。
5.整个过程中的一个小插曲就是大家都不会使用工具裁剪出一个符合要求的256×256大小的位图,没有办法只好在网上搜索才将这个问题解决。
从整个完成作业的过程中来看,最大的困难并不是作业本身,而是团队的每一个成员如何协同合作,将每个人的能力发挥出来,一个人能力在强也是不可能在一定的时间内独自完成一个艰巨的任务,只有发挥团队合作的精神,才能够在规定的时间内完成一项任务。
同时给我的第二个启发就是网络的伟大,在这个信息的时代,互联网的作用显而易见,老师在布置作业时也提到了可以去网上搜索,如果能够充分得利用网络上海量的信息,掌握一定的检索技巧,就可以获得很多有价值的东西,这比起关起门来自己钻研要强上很多倍,同时,对于如何使用verilog写出可综合的代码真的是一件很困难的事情,比如这次,由于时间的紧迫,最终也只是写出了一种算法,而真正的可以综合的代码确实还需要经过很长时间的锻炼,这也是今后需要努力的方向。
最后,感谢老师在这个学期开了verilog这门课程,使我学到了很多知识,培养了我对电路设计的兴趣。
王腾星的个人总结这次Verilog大作业的完成是我们五个人团队协作的结晶,为了让每个人的收获都最大化,作业中每一个部分都是五个人一起协商解决的。
从图像顺时针旋转算法的确定到代码的编写,从对BMP图像的一无所知到一起上网去图书馆查资料解决了BMP图像的理论问题,从对二进制转bmp图像一无所知到最终选定WinHex软件成功完成转换,到最终完成这次大作业,我们五个人都一直在一起,一起学习,一起讨论。
期间犯了无数的错误,也积累了很多经验,比如仿真时间要选择恰当,用$fwrite往文件中写数据是必须要用“%h”注明被写入的数据是十六进制的等等很多技巧,更增进了Verilog语言的理解,达到了学以致用的目的。
也更熟练地掌握了ModelSim仿真软件。
通过这次的大作业,我深深体会到了团队的重要性以及如何形成好的团队协作,也明白了一定要在实践中去掌握知识,而知识也只能在实际应用中才能真正掌握并升华。
从课上认真吸收老师的精心讲解,到课下通过团队努力完成了这个也可以说是一个小工程的作业,使我对Verilog的兴趣又更进了一步,也更增进了我对继续钻研Verilog的决心。
徐建龙的工作总结经过我们团队的努力完成了大作业,我的收获很多,主要有以下几点:1.这次的大作业是次开放性的大作业,通过查阅相关资料结合所学过的知识来设计程序完成对图像顺时针旋转90度。
通过这次大作业,对modelsim仿真软件的使用流程有了最基本的了解,使课堂上学的东西得到了很好的实践,在大作业完成之际也体会到了成功的喜悦。
2.对知识的掌握不只是学习课本上的知识,而且应该查阅大量相关的资料。
查阅资料是现代科技人员很重要的一项技能,在这次大作业中尤其体现明显。
用到的很多知识都不是从课本上学来的,但是要完成大作业必须要查阅大量资料。
比如bmp图片的相关知识,只有通过查阅资料才能够掌握从而为自己所用。
3.学以致用的重要性:学的很多知识不运用不能是真正的掌握,这一点在我身上很是有所体现。
比如说算图像顺时针转移的算法时,就相当于对一个矩阵中的数据的为之进行适当的转换,但是我的算法出了几次问题,在最后快要成功时功亏一篑,对团队的工作产生了比较大的影响。
对此我很惭愧,这就是以前学习的知识不能够很好的应用,对于这一点我应该加以相当的重视4.团队合作的重要性。
在这次的大作业过程中遇到了很多的问题,比如说是开始选图片的错误,误认为把一图片压缩成256*256的,实际上应该是剪切这么大小的,不应该是压缩的,这样导致了最后读出来的txt文件有不确定值x.开始个人一直找不到问题,在大家细心的排查下,发现问题出于最开始图片的选取上。
这只是过程中的一个问题,但充分说明了团队合作的重要性。
5.在完成这次大作业的过程中充分感受到自己知识的不足以及上面所说的学以致用的重要性,有很多不懂的地方,要通过不断的学习来提高自己,这正验证了学海无涯这句古话。
这次的大作业是次很好的实践。
通过自己设计,大家都很有收获,不仅完成了作业,而且学到了知识,关键的是自己的自学能力有所加强,所以希望以后还有更多实践的机会,这对于我们的提高大有好处,因为时间是检验真理的唯一标准。
这次机会也是我们的一次宝贵经验,对以后的学习工作有很好的借鉴作用。
万杰的工作总结这次的大作业是通过我们小组5个同学共同努力下完成的,其中有很多收获也有很多感受。
这次的大作业给了我们一次很好的锻炼机会,通过这次大作业,我开始熟悉用verilog 设计的最基本的方法和流程,课堂上学到的东西只有自己通过应用才能加深自己的理解,课堂上学到的并不是全部,要想真正的学好这门课,只有在实践中运用才能真正的体会到这门课的精髓,这次的大作业很好的验证了。
刚拿到这个问题时自己根本就不知道该从哪下手,通过小组成员一起讨论,确定了从bmp 格式的图片中读出它的二进制代码,再用verilog编程实现二进制代码排序的转变,再通过将二进制代码转换成bmp格式图片的方针。