此帖已同步更新到FPGADIY进程贴。 2012.11.26
继续学习VerilogHDL。
大致浏览了下VerilogHDL程序设计与实践,整个书看得也是云里雾里的。前几天看51FPGA版主的教程遇见的几个问题重点看了下。
有点小收获。今天刚把ModelSIM装上去了,这不晚上就来显摆了。
实验是哟个三分频器,占空比是50%的三分频器。参照书上的做法,用一个占空比为1/3 和一个占空比为2/3的波形进行或运算,之后就得到了占空比为占空比为50%的波形,当然这两个进行与运算的波形相位是一致的。
先看RTL级的框图,我是没看明白为什么会这样,但各个模块很清晰
再上波形图,ModelSim10d里边进行的仿真。
最后是代码:
/*3分频器 占空比50%*/
module clk_div3(clk_in,rst_n,clk_out);
input clk_in;
input rst_n;
output clk_out;
reg [1:0] cnt,cnt1;
reg clk_1to3p,clk_1to3n;
always@(posedge clk_in) //两个Always块并行执行,
begin
if(!rst_n) //复位时候的处理
begin
cnt<=0;
clk_1to3p <= 0;
end
else
begin
if(cnt == 2'b10)
begin
cnt<=0; //数数,到2就归零。波形不反转
clk_1to3p <= clk_1to3p;
end
else
begin
cnt <= cnt+1; //数数,0和1时候波形反转。
clk_1to3p <= !clk_1to3p;
end
end
end
always@(negedge clk_in)
begin
if(!rst_n)
begin
cnt1<=0;
clk_1to3n <=0;
end
else
begin
if(cnt1 == 2'b10)
begin
cnt1<=0;
clk_1to3n <=clk_1to3n;
end
else
begin
cnt1<= cnt1+1;
clk_1to3n <=!clk_1to3n;
end
end
end
assign clk_out = clk_1to3p | clk_1to3n; //或运算,得到占空比50%的波形
endmodule
共9条
1/1 1 跳转至页
继续学习VerilogHDL,试验几个有意思的操作符
3楼
QII 12.0没内带仿真。
昨晚手机下了一晚上才把ModelSim下下来的。
好的东西不会用。先凑合一下。
VerilogHDL内建好多仿真的东西,这些东西要专门抽出时间学吗?我这几天基本只看了语法,然后就是看代码
昨晚手机下了一晚上才把ModelSim下下来的。
好的东西不会用。先凑合一下。
VerilogHDL内建好多仿真的东西,这些东西要专门抽出时间学吗?我这几天基本只看了语法,然后就是看代码
9楼
昨天收到了热风枪,一晚上的时间将主片修改了回来。然后将坏掉的板子上边的零件拆到新板子上。
焊完之后,今天检查发现虚焊。原因我上锡上的太少了,生怕连焊。今天拿着镊子一个个引脚拨,将没焊好的引脚又补了一烙铁。然后检查连焊短路问题。基本排除。
由于不知道什么原因,我第一个焊上去的就是主片。然后才是电源部分。电源正常不正常还不知道。
板子上现在还缺几个零件,被我吹丢了,回家才能补。
今天继续写程序。
今天试验了两个东西,一个是一位运算符一个是拼接运算。
第一个程序实现了通过移位运算对输入数据乘以19,第二个实现了几个简单的数据拼接;
/*利用移位运算符实现将输入数据乘以19*/
module amp19(sys_clk,din,dout);
input sys_clk;
input [7:0] din;
output [11:0] dout;
reg [11:0] dout16;
reg [11:0] dout2;
reg [11:0] dout1;
always@(posedge sys_clk)
begin
dout16 <= din<<4; //乘以16
dout2 <= din<<1; //乘以2
dout1 <= din; //乘以1
end
assign dout = dout16+dout2+dout1; //相加,非阻塞
endmodule
拼接操作很自由,相当于把几位数放到一起,组成一个新的数
/*拼接运算符实验*/
module pinjie(data_out,data_in,sys_clk);
input [3:0] data_in;
input sys_clk;
output [15:0] data_out;
reg [15:0] data_out;
//parameter shiftreg = 14'b11111111111111;
//wire [14:0] shiftreg;
//assign shiftreg = 15'b111111111111111;
always@(posedge sys_clk)
begin
//data_out[15:0] <={shiftreg[14:0],data_in};
data_out[15:0] <= {data_in[3:0],!data_in[0],!data_in[3:1],data_in[3:0],!data_in[3:0]};
end
endmodule
焊完之后,今天检查发现虚焊。原因我上锡上的太少了,生怕连焊。今天拿着镊子一个个引脚拨,将没焊好的引脚又补了一烙铁。然后检查连焊短路问题。基本排除。
由于不知道什么原因,我第一个焊上去的就是主片。然后才是电源部分。电源正常不正常还不知道。
板子上现在还缺几个零件,被我吹丢了,回家才能补。
今天继续写程序。
今天试验了两个东西,一个是一位运算符一个是拼接运算。
第一个程序实现了通过移位运算对输入数据乘以19,第二个实现了几个简单的数据拼接;
/*利用移位运算符实现将输入数据乘以19*/
module amp19(sys_clk,din,dout);
input sys_clk;
input [7:0] din;
output [11:0] dout;
reg [11:0] dout16;
reg [11:0] dout2;
reg [11:0] dout1;
always@(posedge sys_clk)
begin
dout16 <= din<<4; //乘以16
dout2 <= din<<1; //乘以2
dout1 <= din; //乘以1
end
assign dout = dout16+dout2+dout1; //相加,非阻塞
endmodule
拼接操作很自由,相当于把几位数放到一起,组成一个新的数
/*拼接运算符实验*/
module pinjie(data_out,data_in,sys_clk);
input [3:0] data_in;
input sys_clk;
output [15:0] data_out;
reg [15:0] data_out;
//parameter shiftreg = 14'b11111111111111;
//wire [14:0] shiftreg;
//assign shiftreg = 15'b111111111111111;
always@(posedge sys_clk)
begin
//data_out[15:0] <={shiftreg[14:0],data_in};
data_out[15:0] <= {data_in[3:0],!data_in[0],!data_in[3:1],data_in[3:0],!data_in[3:0]};
end
endmodule
共9条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |